質問

次のように定義されている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 宣言。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top