在Python3.2中调用Python2.7模块
我有一个用Python 3.2开发的GUI程序,用于提取各种地理空间数据产品。我需要调用我在Python2.7中开发的模块 我正在寻找一种能够使用Python 3.2程序内部的Python 2.7解释器调用Python 2.7代码的方法。我无法将2.7移植到Python3.2,因为它使用的是与ESRI ArcMap一起安装的Python版本,并且依赖于Python3不可用的arcpy模块。我现在唯一的想法是使用subprocess将模块作为批处理过程调用,但是这有点混乱,我更希望这两个程序有一些关系在Python3.2中调用Python2.7模块,python,python-2.7,python-3.x,subprocess,arcpy,Python,Python 2.7,Python 3.x,Subprocess,Arcpy,我有一个用Python 3.2开发的GUI程序,用于提取各种地理空间数据产品。我需要调用我在Python2.7中开发的模块 我正在寻找一种能够使用Python 3.2程序内部的Python 2.7解释器调用Python 2.7代码的方法。我无法将2.7移植到Python3.2,因为它使用的是与ESRI ArcMap一起安装的Python版本,并且依赖于Python3不可用的arcpy模块。我现在唯一的想法是使用subprocess将模块作为批处理过程调用,但是这有点混乱,我更希望这两个程序有一些
提前感谢。尝试使用
子流程。检查输出(['C:\\python27\\python.exe','yourModule.py'])
如果要调用27文件中的特定函数,可以使用更多系统参数。这个电话看起来像:
subprocess.check_output(['C:\\python27\\python.exe', 'yourModule.py', 'funcName'])
在27文件中,您可以添加:
import sys
if __name__=='__main__':
if 'funcName' in sys.argv:
funcName()
else:
#... execute normally
您可以将Python2.7进程生成为一个服务器,处理运行在3.2上的GUI发出的RPC请求。这将通过网络、本地管道、共享内存、系统消息总线或许多其他方式工作。您只需要将库的API转换为某种序列化消息 假设您的库有一个函数:(超级简化示例) 您可以将其封装在某个服务器中,比如说a,它可以:
@app.route("/add", methods=["POST"])
def handle_add():
data = request.get_json()
ret = your_lib.add(data['a'], data['b'])
return jsonify(ret)
在客户端,使用如下方式发送和解压缩值
您甚至可以通过使用与库本身名称相同的方法实现一个转换器模块,并将您的\u http\u包装器作为\u库名称导入,使其相当透明
现在的诀窍是确保所有参数都可以序列化,并且可以在每次调用的合理时间内发送所有参数/返回值。此外,您将无法更改传递给包装器的变量的内容,因为服务器将只修改本地副本(除非您也实现了序列化所有这些修改)有些晚,但万一有人在这个线程上绊倒:
我已经编写了一个脚本,它在其他python解释器中透明地运行程序的一部分。基本上,它提供装饰器和基类,用与其他解释器接口的代理替换函数和对象
它旨在实现兼容性,例如仅在python3
中运行python2
代码,或从pypypy
访问C模块
在下面的示例中,通过使用pypypy
循环运行的速度是使用普通python
循环运行速度的4倍
#!/usr/local/bin/python
from cpy2py import TwinMaster, twinfunction
import sys
import time
import math
# loops in PyPy
@twinfunction('pypy')
def prime_sieve(max_val):
start_time = time.time()
primes = [1] * 2 + [0] * (max_val - 1)
for value, factors in enumerate(primes):
if factors == 0:
for multiple in xrange(value*value, max_val + 1, value):
primes[multiple] += 1
return {'xy': [
[primes[idx] == 0 for idx in range(minidx, minidx + int(math.sqrt(max_val)))]
for minidx in range(0, max_val, int(math.sqrt(max_val)))
], 'info': '%s in %.1fs' % (sys.executable, time.time() - start_time)}
# matplotlib in CPython
@twinfunction('python')
def draw(xy, info='<None>'):
from matplotlib import pyplot
pyplot.copper()
pyplot.matshow(xy)
pyplot.xlabel(info, color="red")
pyplot.show()
if __name__ == '__main__':
twins = [TwinMaster('python'), TwinMaster('pypy')]
for twin in twins:
twin.start()
data = prime_sieve(int(1E6))
draw(**data)
#/usr/local/bin/python
从cpy2py导入TwinMaster,twinfunction
导入系统
导入时间
输入数学
#PyPy中的循环
@twinfunction('pypy')
def基本筛(最大值):
开始时间=time.time()
素数=[1]*2+[0]*(最大值-1)
对于值,枚举中的因子(素数):
如果系数==0:
对于X范围内的倍数(值*值,最大值+1,值):
素数[多重]+=1
返回{'xy':[
[primes[idx]==0表示范围内的idx(minidx,minidx+int(math.sqrt(max_val))]
对于范围(0,max_val,int(math.sqrt(max_val))内的minidx
],“信息”:%.1fs%%中的“%s”(sys.executable,time.time()-start\u time)}
#CPython中的matplotlib
@twinfunction('python')
def绘图(xy,信息=“”):
从matplotlib导入pyplot
pyplot.copper()
pyplot.matshow(xy)
pyplot.xlabel(信息,color=“红色”)
pyplot.show()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
twins=[TwinMaster('python'),TwinMaster('pypy')]
对于双胞胎中的双胞胎:
twin.start()
数据=基本筛(int(1E6))
绘图(**数据)
您知道我可以用参数调用此python文件的特定函数吗?虽然我最初从未打算使用subprocess,但它确实按预期完成了工作,谢谢:)不过使用它看起来非常有用,谢谢!
#!/usr/local/bin/python
from cpy2py import TwinMaster, twinfunction
import sys
import time
import math
# loops in PyPy
@twinfunction('pypy')
def prime_sieve(max_val):
start_time = time.time()
primes = [1] * 2 + [0] * (max_val - 1)
for value, factors in enumerate(primes):
if factors == 0:
for multiple in xrange(value*value, max_val + 1, value):
primes[multiple] += 1
return {'xy': [
[primes[idx] == 0 for idx in range(minidx, minidx + int(math.sqrt(max_val)))]
for minidx in range(0, max_val, int(math.sqrt(max_val)))
], 'info': '%s in %.1fs' % (sys.executable, time.time() - start_time)}
# matplotlib in CPython
@twinfunction('python')
def draw(xy, info='<None>'):
from matplotlib import pyplot
pyplot.copper()
pyplot.matshow(xy)
pyplot.xlabel(info, color="red")
pyplot.show()
if __name__ == '__main__':
twins = [TwinMaster('python'), TwinMaster('pypy')]
for twin in twins:
twin.start()
data = prime_sieve(int(1E6))
draw(**data)