如何导入用其他版本的python编写的程序?

时间:2018-12-16 15:57:04

标签: python python-3.x compatibility python-2.x

我有一个用Python 2.7编写的python脚本,但想将其导入用3.5编写的python脚本中,如何确保python脚本知道用于读取该脚本的python版本?

谢谢!

2 个答案:

答案 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)。

1。使脚本在python 2和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的文档。

2。将旧的python 2脚本转换为python 3(可能无法与python 2向后兼容)

如果要将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兼容的脚本。您的里程可能会有所不同。