Python 3からPython 2スクリプトを呼び出す質問する

Python 3からPython 2スクリプトを呼び出す質問する

スクリプトが 2 つあり、メインは Python 3 で、2 つ目は Python 2 で書かれています (Python 2 ライブラリも使用しています)。

Python 2 スクリプトには、Python 3 スクリプトから呼び出したいメソッドが 1 つありますが、この橋を渡る方法がわかりません。

ベストアンサー1

異なるPythonバージョンを互いに呼び出すことは、次のように非常にエレガントに行うことができます。実行ネット次の関数が役立ちます:

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()

例: my_module.pyPython 2.7 で記述:

def my_function(X, Y): 
    return "Hello %s %s!" % (X, Y)

次に次の関数呼び出し

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!

何が起こったかというと、 で引数リストを待機して「ゲートウェイ」がインスタンス化されました。引数リストchannel.receive()が到着すると、変換されて に渡されます。は生成した文字列を返し、その文字列を送り返しました。ゲートウェイの反対側では、その結果をキャッチして呼び出し元に返します。呼び出し元は最終的に、Python 3 モジュールでによって生成された文字列を出力します。my_functionmy_functionchannel.send(...)channel.receive()my_function

おすすめ記事