Python2到Python3的转换工具2to3
近期在研究使用Python
绘图,但是veusz
官方网站上给出的例子好多都是Python2
格式.
如果代码量比较少,则按照Python2.x与Python3.x版本区别一点一点的修改即可,
但是如果代码量比较大,那这一点一点的修改显然效率太低了。好在,Python3
内置了一个转换工具2to3
,
可以方便的完成从Python2.x
到Python3.x
的转换工作。
2to3 简介
2to3 是一个 Python 程序,它可以用来读取 Python 2.x 版本的代码,并使用一系列的 修复器 来将其转换为合法的 Python 3.x 代码。标准库中已经包含了丰富的修复器,这足以处理绝大多数代码。不过 2to3 的支持库 lib2to3 是一个很灵活通用的库,所以你也可以为 2to3 编写你自己的修复器。lib2to3 也可以用在那些需要自动处理 Python 代码的应用中。
使用方法
2to3
的基本调用参数是一个需要转换的文件或目录列表。对于目录,会递归地寻找其中的
Python 源码。例如,一个Python2.x
的源文件为:
1 | def greet(name): |
它可以在命令行中使用 2to3 转换成 Python 3.x 版本的代码:
1 | 2to3 example.py |
这个命令会打印出和源文件的区别。通过传入 -w 参数,2to3 也可以把需要的修改写回到原文件中(除非传入了 -n 参数,否则会为原始文件创建一个副本):
1 | 2to3 -w example.py |
转换完成后,example.py 看起来像是这样:
1 | def 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 |