在内存脚本上使用 2to3

Using 2to3 on in-memory scripts

我有一个 Python 2.7 格式的脚本数据库。在我的 Python 3 应用程序中加载后,我想将它们转换为 Python 3 格式而不将每个脚本写入文件。我尝试了以下方法:

from lib2to3 import refactor
def convert_2to3(py_script):
    avail_fixes = refactor.get_fixers_from_package('lib2to3.fixes')
    py_converter = refactor.RefactoringTool(avail_fixes)
    ast = py_converter.refactor_string(py_script, '<script>')
    return str(ast)

然而有时这会失败;例如,如果 py_script 只是 "pass"。错误是神秘的:

lib2to3.pgen2.parse.ParseError: bad input: type=0, value='', context=('\n', (2, 0))

如果 py_script 是 "",或者它是一个多行字符串,它会起作用。知道什么可能导致简单案例失败吗?

传入 "pass\n" 似乎可以正常工作。事实上,任何末尾没有“\n”的单行 python 都会导致解析器失败,例如“1+1”。这可能是由于 python 对间距/缩进的特定敏感性,类似于使用 code.InteractiveInterpreter 实例运行源时格式化代码字符串所需的注意,但我没有深入挖掘。