2017-03-08 69 views
0

我想知道是否有可能从python3脚本执行python2脚本。从python3执行()python2脚本

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

在PY3行调用提到PY2脚本是

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

脚本没有错误,直到它开始处理python2script.py,在该点它崩溃在与版本3的第一差值运行。

+2

你可以使用'os.system('python python2script.py')'?这相当于在命令行中发出引号中的命令。 –

+0

'exec'将自然执行它在当前(python 3)解释器中收到的所有内容。 –

+1

如果'os。系统“不起作用,那么你可以看看重写python2脚本来使用'__future__'导入和更多python3友好的语法。但是,exec(open(python2file).read())是一种非常笨重的方法。首选的方法是“导入python2file”并运行其代码。 –

回答

-1

我不相信从python 3脚本执行python 2脚本是不可能的。但是,将纯Python的2.x代码转换为3.x通常是一种直接的机械翻译。有一个叫做2to3的程序来帮助你完成那些杂事。

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,这样你可以在你的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的路径。有很多选择,它非常复杂,但超出了问题的范围。你只需要仔细阅读文档页面,并尝试一些事情!

+0

使用'os.system'执行@Benjamin和你(@daphtdazz)提到的问题是来自py3脚本用于执行py2,然后从py2保存的对象在py3脚本的模块中调用。返回的一个示例错误声明'TypeError:'模块'对象不是可下载的'。 py3脚本被修改为原始py2脚本(使用py3与新模块frm导入进行交互)。这个过程最初是通过'execfile('py2script.py')'完成的,我所描述的全部都是允许的。 –

+0

对不起,我应该仔细阅读一下。我已经更新了我的答案,以展示如何使用'json'在两者之间传输数据。您可能会发现这比将python2脚本转换为python3更容易 - 您甚至可以编写一个小的包装python2脚本,它使用旧的exec机制来获取结果,然后将其发送到python 3 - 但我认为这些脚本是你唯一真正的选择。 – daphtdazz