Python:如何在3.4程序中导入2.7模块?

5 投票
2 回答
4725 浏览
提问于 2025-04-18 11:55

问题:

我写的一个Python 2.7的模块,可以导入到我写的3.4程序里吗?

背景:

我试过这样做,结果就像我预想的那样,出现了一个错误:SyntaxError: Invalid Syntax。这个错误是因为它看到第一个print "字符串"语句时,没法识别,而3.4版本是用print()的。此外,还有一些其他不兼容的代码,比如用import Tkinter而不是tkinter。这个2.7的模块必须留在2.7版本,因为它的一个依赖在3.X版本中似乎不太好用(这是一个用于switchvox API的Python绑定)。

我正在构建一个显示应用程序,它会调用配置文件中指定的任何模块,并在tkinter的窗口小部件中显示该模块的输出(一个字符串,未来可能是一个字典)。我程序需要做的就是导入这个2.7的模块,并每隔一段时间调用一次它的一个函数,以接收那串数据。

2 个回答

0

确实可以让你的代码同时兼容两个版本。最明显的一个问题,可能也是最烦人的,就是打印语句。

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

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

第一行在两个版本中都能正常工作。第二行可以简单改成:

print("Hallo")

这样在两个版本中也能兼容。注意,你可以使用单引号或双引号。

最后一行需要一点小技巧,否则 Python 2 会把括号也打印出来。为了让它在 Python 2 中的工作方式和 Python 3 一样,你需要在模块的顶部导入 print_function 这个功能,来自 future

总之,这就是兼容两个版本的代码:

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

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

想了解更多细节,可以查看这个 速查表

3

你可以让你的 Python 2.7 代码兼容 Python 3.4,这样你就可以从 3.4 导入它,并使用相同的类和函数。

要运行代码,你需要在不同的进程中使用 Python 2.7,这可以通过 subprocess 来实现。

假设 main27.py 文件中有以下一行:

print 1

要通过 subprocess 来运行它,你可以这样做:

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,并通过文件来实现。

撰写回答