我想知道是否可以从python3脚本执行python2脚本。
我有一个使用py3编写的文件,它必须执行用py2编写的遗留代码,以获取在初始文件中处理的字典。
调用上述py2脚本的py3中的行是
exec(open('python2script.py').read())
脚本在开始处理python2script.py
之前运行没有错误,此时它与版本3的第一个区别崩溃。
答案 0 :(得分:2)
正如评论所指出的那样,exec()
使用当前的python实现,因此你无法使用它从python 3执行python 2代码。
除非你移植它,否则最好的办法就是使用os.system
来调用它作为子进程..:
./ py3.py
#!/usr/bin/env python3
import os
print('running py2')
os.system('./py2.py')
print('done')
./ py2.py
#!/usr/bin/env python2.7
print "hello from python2!"
然后(在使它们都可执行之后)运行:
$ ./py3.py
或者您也可以使用更灵活的subprocess
,它允许您使用序列化模块(例如json)更轻松地传回数据,以便您可以从python2脚本获取结果在你的python3代码中:
./ py3.py
#!/usr/bin/env python3
import json
from subprocess import PIPE, Popen
print('running py2')
py2_proc = Popen(['./py2.py'], stdout=PIPE)
# do not care about stderr
stdout, _ = py2_proc.communicate()
result = json.loads(stdout.decode())
print('value1 was %s, value2 was %s' % (result['value1'], result['value2']))
./ py2.py
#!/usr/bin/env python2.7
import json
my_result = {
'value1': 1,
'value2': 3
}
print json.dumps(my_result)
这样可以很容易地收集您需要的数据并将其传输出来。
注意:我在这里使用我的系统的python2.7和python3进行了非常简单的环境设置。在现实世界中,让这类事情正常工作最痛苦的事情是正确配置环境。也许,例如,您正在使用虚拟环境。也许您作为用户在其路径中没有正确的python2版本运行。也许您无法使文件可执行,因此必须在子进程/ os.system调用中指定python的路径。有很多选项,它非常复杂,但超出了问题的范围。您只需要非常仔细地阅读文档页面并尝试一些内容!