Python:如何在3.4程序中导入2.7模块?
问题:
我写的一个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 个回答
确实可以让你的代码同时兼容两个版本。最明显的一个问题,可能也是最烦人的,就是打印语句。
假设你有以下的 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)
想了解更多细节,可以查看这个 速查表。
你可以让你的 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,并通过文件来实现。