【问题标题】:how to import programs written in other versions of python?如何导入用其他版本的python编写的程序?
【发布时间】:2018-12-16 15:57:03
【问题描述】:

我有一个用 Python 2.7 编写的 python 脚本,但想将它导入到用 3.5 编写的 python 脚本中,我如何确保 python 脚本知道使用哪个 python 版本来读取脚本?

谢谢!

【问题讨论】:

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


【解决方案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 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 效率非常低。

【讨论】:

    【解决方案2】:

    您不能简单地导入 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 兼容的脚本。您的里程可能会有所不同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-18
      • 2021-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      相关资源
      最近更新 更多