【问题标题】:exec() python2 script from python3exec() 来自 python3 的 python2 脚本
【发布时间】:2017-03-08 19:00:24
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 你能用os.system('python python2script.py')吗?这相当于在命令行中发出带引号的命令。
  • exec 自然会执行它在当前 (python 3) 解释器中接收到的所有内容。
  • 如果os.system 不起作用,那么您可以考虑重写python2 脚本以使用__future__ 导入和更多python3 友好的语法。但是, exec(open(python2file).read()) 是一种非常笨拙的方法。首选方法是import python2file 并运行其代码。
  • @Benjamin - 我想远离修改 py2 脚本,因为它目前被遗留代码用于初始化数据以进行处理(我从我的脚本 py3 中调用它) )。请参阅我对@daphtdazz 答案的评论,其可用性为os.system('script.py')

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


【解决方案1】:

正如 cmets 所指出的,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 版本。也许您无法使文件可执行,因此必须在 subprocess / os.system 调用中指定 python 的路径。有很多选择,而且非常复杂,但超出了问题的范围。您只需要非常仔细地阅读文档页面并尝试一些事情!

【讨论】:

  • 使用os.system 以@Benjamin 身份执行的问题和你(@daphtdazz)提到的是py3 脚本中的参数用于执行py2,然后在py2 的模块中调用从py2 保存的对象py3 脚本。一个示例错误返回状态 TypeError: 'module' object is not subscriptable。 py3 脚本是对原始 py2 脚本的修改(使用 py3 与导入的新模块进行交互)。这个过程最初是使用execfile('py2script.py') 完成的,我所描述的都是允许的。
  • 对不起,我应该更仔细地阅读。我已经更新了我的答案,以展示如何使用json 在两者之间传输数据。你可能会发现这比将你的 python2 脚本转换为 python3 更容易——你甚至可以编写一个小的包装 python2 脚本,它使用旧的 exec 机制来获取结果,然后将其发送到 python 3——但我认为这些是你唯一真正的选择。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多