次のような構造の python コードがあります。
import A
import B
A.throw()
B.throw()
A
とはどちらもB
C++ で記述されたモジュールです。それらをコンパイルすると、両方とも共通ライブラリexception.so
にリンクします。これには、例外とそれを発生させる関数が含まれています。
class MyException {};
void raise_exception() {
throw MyException();
}
A.cxx
およびB.cxx
ファイルには、python ラッパー関数内に次の行が含まれていthrow()
ます。
try {
raise_exception();
} catch (const MyException& ) {
std::cout << "caught" << std::endl;
}
すべてが正常にコンパイルされ、両方とも単独で正常A
にB
動作します。
両方のモジュールをロードすると、奇妙なことが起こります。例外は、最初に来たA
場合にのみキャッチされます。import A
同様に、が最初にロードされB
た場合にのみ例外をキャッチできます。B
両方のモジュールが同時に機能する必要があり、明らかに、C++ ルーチン内で C++ 例外をキャッチして、上にある Python スクリプトを終了させないようにしたいと考えています。これを達成する方法についてのアイデアはありますか?
編集:raise_exception()
pythonカプセルに含めることは可能かもしれませんが、python モジュールとしてロードされないことを考えると、これはやり過ぎのようexception.so
です (ただし、libpython.so のコードを使用します)。多くの Python モジュールがシステム ヘッダーを使用していることを考えると、ユーザーが作成した C++ ライブラリを含めるのは簡単なことのように思えます。