使用2to3

2to3通常与Python解释器一起安装为脚本。它也位于Python根目录的Tools/scripts目录下

2to3的基本参数是要转换的文件或目录列表。这些目录以递归方式遍历Python源.

这是一个示例Python 2.x源文件,

def greet(name): print "Hello, {0}!".format(name)print "What"s your name?"name = raw_input()greet(name)

它可以通过命令行上的2to3转换为Python 3.x代码:

$ 2to3 example.py

打印对原始源文件的差异。2to3也可以将所需的修改写回源文件。(原始文件的备份除非也给出了-n。)使用-w flag:

$ 2to3 -w example.py

改写后,使用

def greet(name): print("Hello, {0}!".format(name))print("What"s your name?")name = input()greet(name)

在整个翻译过程中保留注释和精确缩进.

默认情况下,2to3运行一组预定义的固定器。-l标志列出了所有可用的固定器。可以使用-f给出一组明确的运行修复程序。同样-x显式禁用了混音器。以下示例仅运行

has_key fixers:
$ 2to3 -f imports -f has_key example.py

此命令运行除apply fixer之外的每个修复程序:

$ 2to3 -x apply example.py

一些修复程序是explicit,意味着它们不是默认运行的,必须在要运行的命令行上标记。这里,除了默认的修复程序,idioms修复程序运行:

$ 2to3 -f all -f idioms example.py

请注意如何通过all启用所有默认修复程序.

有时2to3会在源代码中找到需要更改的位置,但2to3无法自动修复。在这种情况下,2to3将在diff的下方为文件打印警告。您应该解决警告,以便符合3.x代码.

2to3也可以重构doctests。要启用此模式,请使用-d标志。请注意only doctests将被重构。这也不要求模块是有效的Python。例如,doctest就像reSTdocument中的例子也可以用这个选项重构.

-v选项可以输出关于翻译过程的更多信息.

因为一些打印语句可以解析为函数调用或语句,2to3不能总是读取包含打印函数的文件。当2to3检测到from __future__ print_function编译器指令的存在时,它将其内部语法修改为将print()解释为函数。也可以使用-p标志手动启用此更改。使用-p在已经有其print语句转换的代码上运行修复程序

// -o或--output-dir选项允许指定处理输出文件的分析目录。使用它时需要-n标志,因为备份文件在没有覆盖输入文件时没有意义.

新版本3.2.3: -o选项已添加.

-W或--write-unchanged-files标志告诉2to3始终写入输出文件,即使文件不需要更改。这对-o最有用,所以整个Python源代码树都会从一个目录复制到另一个目录。这个选项意味着-w标志,否则就没有意义了.

版本3.2.3中的新增内容:添加了-W标志.

--add-suffix选项指定要附加到所有输出文件名的字符串。指定此时需要-n标志,因为在写入不同的文件名时不需要备份。示例:

$ 2to3 -n -W --add-suffix=3 example.py

将导致转换后的文件名为

新版本3.2.3: --add-suffix选项已添加.

要将整个项目从一个目录树转换为另一个目录树,请使用:

$ 2to3 --output-dir=python3-version/mycode -W -n python2-version/mycode