7

次のように定義された 2 つの boost 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 はモジュール間でクラスを自動的に変換しないようです。これを解決する方法を知っている人はいますか?

4

3 に答える 3

7

私は最近Boost.Pythonをいじり始めましたが、同じ問題がありました。

次のドキュメントのセクション6を確認してください。

http://www.boost.org/doc/libs/1_47_0/libs/python/doc/building.html

6.1-ダイナミックバイナリ

ライブラリには、型変換レジストリが含まれています。1つのレジストリがすべての拡張モジュール間で共有されるため、動的にロードされた1つの拡張モジュールでPythonに公開されたクラスのインスタンスを、別のそのようなモジュールで公開された関数に渡すことができます

静的バイナリを使用していて、同じタイプのエラーが発生しました。ダイナミックバイナリに変更すると、コンパイルされて正常に実行されました。

于 2011-08-23T11:20:07.000 に答える
0

あなたの最新の回答と質問の更新されたエラー メッセージに基づいて、あなたの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)
    ;
}

2 つの宣言のそれぞれで、ステートメントにboost::python::接頭辞" " が挿入されていることに注意してください。class_<...>BOOST_PYTHON_MODULE

于 2010-12-14T16:32:04.747 に答える