正如注释所指出的,exec()使用当前的python实现,因此不能使用它从python3执行python2代码。在
除非将其移植,否则最好的办法是将其作为子进程调用,使用^{}..:
./py3.py#!/usr/bin/env python3
import os
print('running py2')
os.system('./py2.py')
print('done')
./py2.py
^{2}$
然后(在使它们都可执行之后)运行:$ ./py3.py
或者,您也可以使用更灵活的^{},它允许您使用诸如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版本。也许您无法使文件可执行,因此必须在子进程/操作系统打电话。有许多选择,这是非常复杂的,但超出了问题的范围。你只需要非常仔细地阅读doc页面并尝试一些东西!在