在Python3.2中调用Python2.7模块

在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将模块作为批处理过程调用,但是这有点混乱,我更希望这两个程序有一些

我有一个用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)