【问题标题】:Python: How to import 2.7 module into 3.4 program?Python:如何将 2.7 模块导入 3.4 程序?
【发布时间】:2014-08-23 16:29:35
【问题描述】:

问题:

是否可以将我在 python 2.7 中编写的模块导入到我编写的 3.4 程序中?

背景:

我已经尝试过这样做,并且正如预期的那样,一旦它看到第一个 print "string literal" 语句而不是 3.4 的 print(),它就会抛出一个 SyntaxError: Invalid Syntax。还有一些额外的不兼容代码 sn-ps,例如 import Tkinter 而不是 tkinter。 2.7 模块必须保留在 2.7 中,因为其中一个依赖项似乎在 3.X(switchvox api 的 python 绑定)中不起作用。

我正在构建一个显示应用程序,该应用程序将调用其配置文件中指定的任何模块,并在 tkinter 小部件中显示该模块的输出(一个字符串,或者将来可能是一个字典)。我的程序需要做的就是导入 2.7 模块并调用一个函数一次(每 x 秒)以接收该数据字符串。

【问题讨论】:

  • 如果其中一个 依赖项 没有在 Python 3 中运行,那么尝试移植您的模块是没有意义的。
  • @MartijnPieters 你是指原3.4调用程序的依赖,还是被调用的2.7程序的依赖,还是两者之一?
  • 2.7 模块不是程序。它是只有 Python 2.7 解释器可以运行的 Python 代码。导入它意味着它需要能够在 Python 3.4 too 上运行。那是 certainly possible,尤其是 supporting module,但如果 2.7 模块具有不在 3 中运行的依赖项,那么所有的赌注都没有了。
  • 你的程序有什么理由必须在 Python 3.4 上运行吗?为什么不在 2.7 中运行它?
  • @ColinAtkinson 你说得对,我正在权衡那个选项。最初我们只是认为从 3.4 开始会更好,因为它更新并且将来可能会得到更好的支持

标签: python python-2.7 python-3.x import


【解决方案1】:

您可以使您的 python 2.7 代码与 3.4 兼容 - 这样您就可以从 3.4 导入它并使用相同的类和函数。

为了运行,您必须使用 python 2.7 在不同的进程上运行它 - 使用子进程。 假设 main27.py 有以下行:

print 1

要使用子进程运行它,请执行以下操作:

import subprocess
cmd = [r'c:\python27\python.exe', 'main27.py']
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = p.communicate()

与标准输出相比,您有以下输出:

1

对于更复杂的数据交换,您可以使用 json 或使用文件的 pickle。

【讨论】:

  • 感谢哈盖的回答。你能解释一下如何运行“不同的进程”或“子进程”吗?
【解决方案2】:

确实可以使您的代码与这两个版本兼容。最明显且可能更烦人的是 print 语句。

假设您有以下 Python 2.x 代码:

name = "beautiful"
print "Hallo"
print "I mean, hallo ", name

第一行在两个版本中都可以正常工作。第二行,可以变成:

print("Hallo")

这也与两个版本兼容。请注意,您可以使用单引号或双引号。

最后一行需要一点技巧,否则 Python 2 也会打印括号。为了使其在 Python 2 中的工作方式与在 Python 3 中相同,您必须从模块顶部的 future 导入 print_function。 p>

总之,这是双重兼容的代码:

#Works in Python 2.x or Python 3.x
from __future__ import print_function

print("Hallo")
print("I mean, hallo ", name)

查看cheat sheet了解更多详情。

【讨论】: