我有一个用Python 2.7编写的python脚本,但想将其导入用3.5编写的python脚本中,如何确保python脚本知道用于读取该脚本的python版本?
谢谢!
答案 0 :(得分:1)
如果您的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_function
from __future__ import division
from six.moves import range
有关使python 2和3代码协同工作的更多信息,请查看Six: Python 2 and 3 Compatibility Library的文档。
如果要将python 2脚本转换为python 3,可以使用2to3,但请注意。
让我们看一下这个简单的python 2.7片段:
# 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中使用脚本,则可能会出现问题。例如,与range
相比,在python 2.7中使用xrange
的效率非常低。
答案 1 :(得分:0)
您不能简单地导入Python 2代码,除非它被专门编写为与Python 2/3兼容(这并不罕见)。
通常的建议是,如果Python 2无法运行,则将Python 2脚本升级到Python3。标准库2to3
可以帮助您解决此问题,并且有第三方工具可以这样更容易,例如python-future对于简短的脚本,我将推荐该建议。
但是,这不是 only 方式。
第二个选择:您可以在从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代码改编为Python3。根据两个代码库的相对大小和复杂程度,这可能是更简单的选择,尤其是因为Tauthon已经支持您可能正在使用的大多数Python 3功能。
最后,您可以使用lib2to3import之类的工具在导入时自动将脚本转换为Python 3。这可能最接近您的要求,但是我还没有发现这种工具非常可靠。这种方法实际上并不仅仅比将脚本转换为Python 3还简单,但是如果其他人在维护它,则可能会使升级变得更加容易,因为您不必自己重新转换它。另外,即使您进行更改,也可以继续使用来自Python 2和Python 3程序的相同版本的Python 2脚本,而无需进行2/3兼容的脚本。您的里程可能会有所不同。