来自python3

时间:2017-03-08 19:00:25

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

我想知道是否可以从python3脚本执行python2脚本。

我有一个使用py3编写的文件,它必须执行用py2编写的遗留代码,以获取在初始文件中处理的字典。

调用上述py2脚本的py3中的行是

exec(open('python2script.py').read())

脚本在开始处理python2script.py之前运行没有错误,此时它与版本3的第一个区别崩溃。

1 个答案:

答案 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的路径。有很多选项,它非常复杂,但超出了问题的范围。您只需要非常仔细地阅读文档页面并尝试一些内容!