Pythonインタプリタとしてのc++クラス
-
18-09-2019 - |
質問
またpythonを埋め込c++.一部の特異なっていると必要とは別のインスタンスの通訳者が同一のねじになります。
できまwrap Pythonインタプリタをc++クラス、サービスのより良いコミュニケーションクラスのインスタンス?
解決
私は別のスレッドで異なる通訳のためにPy_NewInterpreterを使用しているが、これは、1つのスレッドの中にいくつかの通訳のために働く必要があります:
メインスレッドで
Py_Initialize();
PyEval_InitThreads();
mainThreadState = PyEval_SaveThread();
各インタプリタ例えば(任意のスレッドで)
// initialize interpreter
PyEval_AcquireLock(); // get the GIL
myThreadState = Py_NewInterpreter();
... // call python code
PyEval_ReleaseThread(myThreadState); // swap out thread state + release the GIL
... // any other code
// continue with interpreter
PyEval_AcquireThread(myThreadState); // get GIL + swap in thread state
... // call python code
PyEval_ReleaseThread(myThreadState);
... // any other code
// finish with interpreter
PyEval_AcquireThread(myThreadState);
... // call python code
Py_EndInterpreter(myThreadState);
PyEval_ReleaseLock(); // release the GIL
あなたは、各インタプリタインスタンスの変数myThreadStateが必要であることに注意してください!
メインスレッドで最後に仕上げます:
PyEval_RestoreThread(mainThreadState);
Py_Finalize();
があり(彼らは完全に独立ではないと思われる)いくつかのインタプリタのインスタンスを使用していくつかの制限がありますが、ほとんどの場合、これは問題を引き起こしていないようです。
他のヒント
コールイン・Py_Initialize()
が二度うまく動作しません、しかし Py_NewInterpreter
にすることができますあなたがやろうとしているものに応じて、動作します。ドキュメントをよくお読み、あなたがこれを呼び出すときにGILを保持する必要があります。
あなたはすることができますが、私は標準の実装がある場合、あなたはPythonインタプリタを再実装しないことをお勧めしたいです。使用のブースト::のpython のパイソンを使用して、インターフェイスにます。
私は残念ながら、私はそれが不可能であると信じて、あなたはこれをしたい最初の人とは思いません。あなたは、RPCを別のプロセスとしてのpython interpertersを実行し、使用することはできますか?
mosaikの答えは私のモジュールがすでにパイソンを初期化し、ホストアプリケーションのプラグインである私の状況では動作しませんでした。私はそれが次のコードで動作するように取得することができた。
// initialize interpreter
::PyEval_InitThreads();
::PyThreadState *mainThread = ::PyThreadState_Get();
myState = ::Py_NewInterpreter();
... // call python code
::PyThreadState_Swap(mainThread);
... // any other code
mainThread = ::PyThreadState_Swap(myState)
... // call python code
::PyThreadState_Swap(mainThread)
... // any other code
// finished with interpreter
mainThread = ::PyThreadState_Swap(myState)
::Py_EndInterpreter(myState);
::PyThreadState_Swap(mainThread)
私はブロックされPyEval_AcquireLock()
プログラムと呼ばれる機能が戻らなかったとき。さらに、呼び出しPyEval_ReleaseThread(myState)
も通訳を無効にするように見えた。
- できるようにpythonインタプリタを保存用メモリの空間です。だけで組み込み、通訳、DLL.
- の設定ができます登録しpythonコンテクストをシミュレーの異なる二つの通訳が配置されていますので