次のような構造の python コードがあります。
import A
import B
A.throw()
B.throw()
AとはどちらもBC++ で記述されたモジュールです。それらをコンパイルすると、両方とも共通ライブラリ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++ ライブラリを含めるのは簡単なことのように思えます。