5

我正在尝试2to3在 *.py 文件具有 Unix 风格的结束行字符的 Windows 机器上运行。运行2to3修改输出文件中的换行符。

MCVE:

print2.py 之前的内容

print "Hello, world!"\n

执行的命令:

2to3 print2.py -w -n

print2.py 之后的内容

print("Hello, world!")\r\n

预期内容:

print("Hello, world!")\n

执行转换时是否可以保留旧的换行符2to3

4

3 回答 3

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
于 2016-08-23T06:53:59.543 回答
0

在 Windows 上,系统行分隔符是\r\n,我们可以在 中看到os.py

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 脚本保留行分隔符,在上述函数中替换 line return input.replace(u"\n", os.linesep)by就足够了。return input

于 2016-08-18T22:46:20.100 回答
0

此问题之前似乎已报告为Python 11594,但仍未解决。在调查中,我发现了推荐的解决方法,lib2to3._to_system_newlines当从 Python 3 运行 lib2to3 时,设置没有任何效果。对我有用的是这样覆盖_open_with_encoding

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

我已经在jaraco.develop中提供了这个功能。可以像调用 lib2to3 一样调用该模块,但应用了补丁:

python -m jaraco.develop.lib2to3 .

或者将其合并到另一个库中,例如 libmodernize:

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

这些技术可能不适用于 Python 2,因此我建议从 Python 3 运行 lib2to3。

于 2017-12-08T19:37:51.440 回答