【发布时间】:2018-12-16 15:57:03
【问题描述】:
我有一个用 Python 2.7 编写的 python 脚本,但想将它导入到用 3.5 编写的 python 脚本中,我如何确保 python 脚本知道使用哪个 python 版本来读取脚本?
谢谢!
【问题讨论】:
标签: python python-3.x compatibility python-2.x
我有一个用 Python 2.7 编写的 python 脚本,但想将它导入到用 3.5 编写的 python 脚本中,我如何确保 python 脚本知道使用哪个 python 版本来读取脚本?
谢谢!
【问题讨论】:
标签: python python-3.x compatibility python-2.x
如果您的python环境使用python 3.5,当您调用脚本时,它将使用环境的python版本运行,即3.5。
如果您调用的脚本与 python 3.5 不兼容,您可能会遇到错误,或者更糟糕的是,可能会遇到更难以捕捉的意外结果(参见下面的除法)
python 2 和 3 之间不兼容的常见原因包括但不限于:
print "hello"(python 2.7)代替print("hello")(python 3),xrange(python 2.7)代替range(python 3),9 / 4 产生 2 (python 2.7) 与产生 2.25 (python 3)。如果你希望你的 python 2.7 脚本与 python 3.5 兼容,你应该使用类似的东西确保它符合 python 3 标准
from __future__ import print_functionfrom __future__ import divisionfrom six.moves import range有关使 python 2 和 3 代码协同工作的更多信息,请查看Six: Python 2 and 3 Compatibility Library 的文档。
如果你想将你的 python 2 脚本转换成 python 3,你可以使用2to3,但是小心。
让我们来看看这个简单的python 2.7 sn-p:
# foo.py
for i in xrange(10):
print i
调用2to3 foo.py -w时,foo.py变为:
# foo.py
for i in range(10):
print(i)
如果您的目标是从现在开始仅将foo.py 与 python 3 一起使用,2to3 是一个不错的解决方案,尽管它不能解决所有问题。但是,如果您还希望继续在 python 2.7 中使用您的脚本,这可能会出现问题。例如,与xrange 相比,在python 2.7 中使用range 效率非常低。
【讨论】:
您不能简单地导入 Python 2 代码,除非它是专门为兼容 Python 2/3 而编写的(这种情况并不少见)。
如果 Python 3 无法运行 Python 2 脚本,通常建议将其升级到 Python 3。标准库 2to3 可以帮助解决这个问题,并且有第三方工具可以做到这一点更简单,例如 python-future 对于简短的脚本,我会支持该建议。
但是,这不是唯一的方式。
第二种选择:您可以在从 Python 3 启动的子进程内的 Python 2 下运行 Python 2 脚本。您可以使用序列化数据(如 JSON 或较旧的 pickle 协议)在进程之间进行通信。这需要在 Python 2 中编写一些胶水代码来帮助来回传递数据。如果您只需要一个大型 Python 2 程序的小接口,这可能比将整个程序升级到 Python 3 更容易。
第三种选择是对两个脚本都使用Tauthon(以前称为“非官方 Python 2.8”)。 Tauthon 与 Python 2 代码完全兼容,但添加了许多您可能想要的 Python 3 功能。这样,您必须使 Python 3 代码适应 Tauthon,而不是将 Python 2 代码适应 Python 3。根据两个代码库的相对大小和复杂性,这可能是更容易的选择,特别是因为 Tauthon 已经支持您可能正在使用的大多数 Python 3 功能。
最后,您可以使用工具在导入时自动将脚本转换为 Python 3,例如 lib2to3import。这可能最接近您的要求,但我还没有发现这样的工具非常可靠。这种方法实际上并不比将脚本转换为 Python 3 更容易,但如果其他人正在维护它,它可能会使升级更容易,因为您不必自己重新转换它。此外,即使在进行更改时,您也可以继续使用 Python 2 和 Python 3 程序中相同版本的 Python 2 脚本,而无需制作 2/3 兼容的脚本。您的里程可能会有所不同。
【讨论】: