スクリプトが 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.py
Python 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_function
my_function
channel.send(...)
channel.receive()
my_function