【4】进程管理-17-不同版本的python混用-execnet
最近有一个需求,需要在py3脚本中调用py2的脚本,第一时间想到,用conda + subprocess 轻松解决,但是conda切换过程中有一些报错,同时也显得不够优雅。这里讲介绍一个python混用的神器 execnet
一、py3脚本中运行py2脚本
定义call_python_version函数
import execnet
def call_python_version(Version, Module, Function, ArgumentList):
gw = execnet.makegateway("popen//python=python%s" % Version)
channel = gw.remote_exec("""
from %s import %s as the_function
channel.send(the_function(*channel.receive()))
""" % (Module, Function))
channel.send(ArgumentList)
return channel.receive()
Python 2.7的module: my_module.py
def my_function(X, Y):
return "Hello %s %s!" % (X, Y)
python3,需要运行的脚本
result = call_python_version("2.7", "my_module", "my_function",
["Mr", "Bear"])
print(result)
result = call_python_version("2.7", "my_module", "my_function",
["Mrs", "Wolf"])
print(result)
结果:
Hello Mr Bear!
Hello Mrs Wolf!
二、execnet简介
execnet提供经过仔细测试的方法,可以跨版本,平台和网络障碍与Python解释器进行临时交互。 它提供了一个针对以下用途的最小且快速的API:
- 将任务分配给本地或远程进程
- 编写和部署混合多进程应用程序
- 编写脚本来管理多个主机
特征:
- 零安装引导:无需远程安装!
- 灵活的通信:支持发送/接收以及回调/队列机制
- python内置类型的简单序列化(没有酸洗)
- 分组创建和强大的流程终止
- 在CPython 2.6-3.X,Jython 2.5.1和PyPy 2.2解释器之间进行了充分测试。
- Windows和Unix-ish系统之间可互操作。
- 集成了不同的线程模型,包括标准的os线程,eventlet和基于gevent的系统。
每个解释器都可以通过管理代码和数据通信的网关(Gateway)访问。 通道(Channels)允许在本地和远程端之间交换数据。 组(Groups)有助于管理子解释器的创建和终止。
总结
这个太强大了,后续再来慢慢研究吧。
参考资料
这里是一个广告位,,感兴趣的都可以发邮件聊聊:tiehan@sina.cn
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn