Python2到Python3的转换工具2to3

近期在研究使用Python绘图,但是veusz官方网站上给出的例子好多都是Python2格式. 如果代码量比较少,则按照Python2.x与Python3.x版本区别一点一点的修改即可, 但是如果代码量比较大,那这一点一点的修改显然效率太低了。好在,Python3内置了一个转换工具2to3, 可以方便的完成从Python2.xPython3.x的转换工作。

2to3 简介

2to3 是一个 Python 程序,它可以用来读取 Python 2.x 版本的代码,并使用一系列的 修复器 来将其转换为合法的 Python 3.x 代码。标准库中已经包含了丰富的修复器,这足以处理绝大多数代码。不过 2to3 的支持库 lib2to3 是一个很灵活通用的库,所以你也可以为 2to3 编写你自己的修复器。lib2to3 也可以用在那些需要自动处理 Python 代码的应用中。

使用方法

2to3 的基本调用参数是一个需要转换的文件或目录列表。对于目录,会递归地寻找其中的 Python 源码。例如,一个Python2.x的源文件为:

python2.x:example.py
1
2
3
4
5
def greet(name):
print "Hello, {0}!".format(name)
print "What's your name?"
name = raw_input()
greet(name)

它可以在命令行中使用 2to3 转换成 Python 3.x 版本的代码:

1
2to3 example.py

这个命令会打印出和源文件的区别。通过传入 -w 参数,2to3 也可以把需要的修改写回到原文件中(除非传入了 -n 参数,否则会为原始文件创建一个副本):

1
2to3 -w example.py

转换完成后,example.py 看起来像是这样:

python3.x:example.py
1
2
3
4
5
def greet(name):
print("Hello, {0}!".format(name))
print("What's your name?")
name = input()
greet(name)

注释和缩进都会在转换过程中保持不变。默认情况下,2to3 会执行 预定义修复器 的集合。使用 -l 参数可以列出所有可用的修复器。使用 -f 参数可以明确指定需要使用的修复器集合。而使用 -x 参数则可以明确指定不使用的修复器。下面的例子会只使用 imports 和 has_key 修复器运行:

1
2to3 -f imports -f has_key example.py

这个命令会执行除了 apply 之外的所有修复器:

1
2to3 -x apply example.py

有一些修复器是需要 显式指定 的,它们默认不会执行,必须在命令行中列出才会执行。比如下面的例子,除了默认的修复器以外,还会执行 idioms 修复器:

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

注意这里使用 all 来启用所有默认的修复器。

--add-suffix 选项接受一个字符串,用来作为后缀附加在输出文件名后面的后面。由于写入的文件名与原始文件不同,所以没有必要创建副本,因此 -n 选项也是必要的。举个例子:

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

这样会把转换后的文件写入 example.py3 文件。将整个项目从一个目录转换到另一个目录可以用这样的命令:

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

参考文章