[英]exec() python2 script from python3
我想知道是否可以从python3脚本执行python2脚本。
我有一个使用py3编写的文件,该文件必须执行用py2编写的旧代码才能获取字典以在初始文件中进行处理。
py3中调用上述py2脚本的行是
exec(open('python2script.py').read())
该脚本运行无错误,直到开始处理python2script.py
为止,此时该脚本在与python2script.py
的第一个差异时崩溃。
正如评论所指出的那样, 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
,该subprocess
允许您使用诸如json之类的序列化模块更轻松地传递和转发数据,以便您可以从python3代码中的python2脚本获取结果:
./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的路径。 有很多选择,而且非常复杂,但是超出了问题的范围。 您只需要非常仔细地阅读文档页面,然后尝试一些操作!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.