【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