2016-08-18 7 views
2

* .pyファイルにUnixスタイルの終端文字があるWindowsマシンで2to3を実行しようとしています。 2to3を実行すると、出力ファイルの改行文字が変更されます。2to3 - 入力ファイルから改行文字を保持する方法は?

MCVE:

2to3 print2.py -w -n 

print("Hello, world!")\r\n 
後print2.py内容:

print "Hello, world!"\n 

実行したコマンドの前に

print2.pyコンテンツ

期待コンテンツ:

print("Hello, world!")\n 

はそれが2to3変換が行われた場合、古い改行文字を維持することは可能ですか? Windowsでは

+0

解決策はありましたか? –

+0

@RégisB。ソリューションよりもハックが多いですが、stdlibのファイルを変更せずに動作するものがあります。 –

答えて

1

コマンドラインでこの動作を変更する標準的な方法はないようですので、コードを実行して不要な動作をパッチする非常に単純なPythonスクリプトを用意しました。

ここではpython modernizeの例ですが、2to3ベースのツールであれば問題ありません。

# to access function to patch 
import lib2to3.refactor 
# actual main 
import libmodernize.main 
# convert str to list of args, not mandatory 
import shlex 
# patch problematic function, as suggested by @mfripp 
lib2to3.refactor._to_system_newlines = lambda input: input 

args = shlex.split("-w -n src") # prepare args 
libmodernize.main.main(args) # pass args to main, equivalent of running cmdline tool 
0

我々はos.pyで見ることができるよう、システムの行区切りは、\r\n次のとおりです。

if 'posix' in _names: 
    ... 
    linesep = '\n' 
    ... 
elif 'nt' in _names: 
    ... 
    linesep = '\r\n' 
    ... 

このラインセパレータをlib2to3.refactorに使用されます。

def _to_system_newlines(input): 
    if os.linesep != "\n": 
     return input.replace(u"\n", os.linesep) 
    else: 
     return input 

そうで行区切りを維持するために2to3スクリプトの場合は、上記の関数のreturn input.replace(u"\n", os.linesep)return inputに置き換えるだけで十分です。

+0

ソースコードを編集したくない場合は、 'lib2to3.refactor._to_system_newlines = lambda input:input'を実行して、現在のセッションにlib2to3.refactorをパッチすることができます。 –

0

この問題は以前Python 11594、まだ未解決として報告されているようです。

lib2to3.refactor._open_with_encoding = functools.partial(open, newline='') 

私は、この機能が利用できるようにしました。調査では、私はlib2to3モジュールはPython 3から実行されたときlib2to3._to_system_newlinesは何私のために仕事をしたことはこれ_open_with_encodingを上書きすることでした任意の効果を持っていない設定、推奨される回避策を見つけましたjaraco.developにあります。モジュールは、ちょうどあなたがlib2to3モジュールを呼び出すと同じように呼び出されますが、パッチを適用することができます。

python -m jaraco.develop.lib2to3 . 

それともlibmodernizeのような別のライブラリにそれを組み込む:

import runpy 
from jaraco.develop import lib2to3 
lib2to3.patch_for_newlines() 
runpy.run_module('modernize') 

これらtechinquesはおそらく上で動作しませんPython 2だから、Python 3からlib2to3を実行することをお勧めします。

関連する問題