2016-05-19 7 views
2

私はさまざまな地理空間データ製品を抽出するためにPython 3.2で開発したGUIプログラムを持っています。 Python 2.7で開発したモジュールを呼び出す必要があります。Python 3.2でPython 2.7モジュールを呼び出す

私は、Python 3.2のプログラムの中でPython 2.7インタプリタを使ってPython 2.7のコードを呼び出せる方法を探しています。 2.7をPython 3.2に移植することはできません。これは、ESRI ArcMapでインストールされたPythonバージョンを使用し、Python 3では使用できないarcpyモジュールに依存しています。私の唯一のアイデアは、サブプロセスを使用してモジュールをバッチプロセスしかし、これはちょっと乱雑ですし、私は2つのプログラムが何らかの関係を持つことを好むでしょう。

ありがとうございます。

答えて

2

は、あなたが27ファイル内の特定の機能を呼び出したい場合は、あなたがより多くのシステムの引数を使用することができますsubprocess.check_output(['C:\\python27\\python.exe', 'yourModule.py'])

を使用してみてください。コールは、次のようになります。

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 
+0

とにかく私はこのpythonファイルの特定の関数を引数で呼び出すことができますか? – lamb

+0

私は私の答えを編集しました –

+0

それはあなたのために働くのですか? –

2

あなたは3.2上で実行しているGUIからのRPC要求を処理サーバとしてのpython 2.7プロセスを生成できます。これは、ネットワーク、ローカルパイプ、共有メモリ、システムのメッセージバス、または他の多くの方法で動作します。ライブラリのAPIを何らかのシリアル化されたメッセージに変換するだけで済みます。

のは、あなたのライブラリが機能を有しているとしましょう:

@app.route("/add", methods=["POST"]) 
def handle_add(): 
    data = request.get_json() 
    ret = your_lib.add(data['a'], data['b']) 
    return jsonify(ret) 

と上を:あなたがしている、のはflask appを言わせて、一部のサーバーでこれをラップしたい

def add(a, b): 
    return a+b 

(超単純化した例)あなたもtranslaを実装することで、それはかなり透明にすることができrequests

のようなものを使用して値を送信して解凍し、クライアント側では、ライブラリと同じ名前のメソッドを使用してimport your_http_wrapper as your_library_nameを実行してください。

トリックは今、すべてのパラメータをシリアル化し、現実的に呼び出しごとに合理的な時間内にすべての引数/戻り値を送ることができることができることを確認することです。また、サーバーはローカルコピーのみを変更するため、ラッパーに渡す変数の内容を変更することはできなくなります(これらすべての変更をシリアル化して実装しない限り)

1

多少遅れてしまいます。このスレッドでは:

module私は他のPythonインタプリタでプログラムの一部を透過的に実行しています。基本的には、関数やオブジェクトを他のインタプリタとインターフェースするプロキシに置き換えるデコレータや基本クラスを提供します。

これは互換性を目的としています。 python2コードをpython3に実行するか、pypyからCモジュールにアクセスしてください。

次の例では、pypyを使用してループを高速で4倍速で実行します(python)。

#!/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) 
+0

これはまだ使用していませんが、とても役に立ちます。 – lamb

関連する問題