ブーストPythonのクロスモジュール依存関係
-
09-10-2019 - |
質問
次のように定義されている2つのブーストPythonモジュールがあるとします。モジュールA:
class SomeClass {
public:
SomeClass() {}
~SomeClass() {}
};
BOOST_PYTHON_MODULE(A)
{
class_<SomeClass>("SomeClass");
}
およびモジュールB:
class AnotherClass {
public:
AnotherClass() {}
~AnotherClass() {}
void func(SomeClass& sp) {}
};
BOOST_PYTHON_MODULE(B)
{ class_<AnotherClass>("AnotherClass")
.def("func", &AnotherClass::func)
;
}
モジュールBはモジュールAに依存しています(つまり、使用します SomeClass
モジュールaから)。次に、次のPythonスクリプトを実行します。
import A
import B
obj1 = A.SomeClass()
obj2 = B.AnotherClass()
obj2.func(obj1)
次のエラーが発生します。
Traceback (most recent call last):
File "C:\bladiebla\script.py", line 8, in <module>
obj2.func(obj1)
ArgumentError: Python argument types in
AnotherClass.func(AnotherClass, SomeClass)
did not match C++ signature:
func(class AnotherClass {lvalue}, class SomeClass)
Pythonはモジュール間でクラスを自動的に翻訳していないようです。誰かがこれを解決する方法を考えていますか?
正しい解決策はありません
他のヒント
私は最近、boost.pythonをいじり始め、同じ問題を抱えていました。
次のドキュメントのセクション6をご覧ください。
http://www.boost.org/doc/libs/1_47_0/libs/python/doc/building.html
6.1-動的バイナリ
ライブラリには、タイプ変換レジストリが含まれています。 1つのレジストリがすべての拡張モジュール間で共有されるため、1つの動的にロードされた拡張モジュールでPythonに公開されたクラスのインスタンスは、そのようなモジュールの別のモジュールに露出した関数に渡すことができます。.
私は静的バイナリを使用していて、あなたが得ているのと同じタイプのエラーを得ました。動的バイナリに変更すると、コンパイルされて正常に実行されました。
質問の最新の回答と更新されたエラーメッセージに基づいて、問題はあなたが BOOST_PYTHON_MODULE
使用法は間違っている可能性があります(それを使用する他の例で見たものに基づいています)。このようなことを試して、それが役立つかどうかを確認してください:
モジュールA:
class SomeClass {
public:
SomeClass() {}
~SomeClass() {}
};
BOOST_PYTHON_MODULE(A)
{
boost::python::class_<SomeClass>("SomeClass");
}
およびモジュールB:
class AnotherClass {
public:
AnotherClass() {}
~AnotherClass() {}
void func(SomeClass& sp) {}
};
BOOST_PYTHON_MODULE(B)
{ boost::python::class_<AnotherClass>("AnotherClass")
.def("func", &AnotherClass::func)
;
}
の挿入に注意してくださいboost::python::
"プレフィックスに class_<...>
2つのそれぞれの声明 BOOST_PYTHON_MODULE
宣言。