2

次のような構造の 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; 
}

すべてが正常にコンパイルされ、両方とも単独で正常AB動作します。

両方のモジュールをロードすると、奇妙なことが起こります。例外は、最初に来たA場合にのみキャッチされます。import A同様に、が最初にロードされBた場合にのみ例外をキャッチできます。B両方のモジュールが同時に機能する必要があり、明らかに、C++ ルーチン内で C++ 例外をキャッチして、上にある Python スクリプトを終了させないようにしたいと考えています。これを達成する方法についてのアイデアはありますか?

編集:raise_exception() pythonカプセルに含めることは可能かもしれませんが、python モジュールとしてロードされないことを考えると、これはやり過ぎのようexception.soです (ただし、libpython.so のコードを使用します)。多くの Python モジュールがシステム ヘッダーを使用していることを考えると、ユーザーが作成した C++ ライブラリを含めるのは簡単なことのように思えます。

4

0 に答える 0