2010-12-14 16 views
6

次のように定義された2つのboost pythonモジュールがあるとします。モジュールA:Boost Pythonにおけるモジュール間の依存関係

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に依存する(すなわち、それは、モジュールAからSomeClassを使用)を有しています。 Pythonは自動的にモジュール間のクラスを変換しないようだ

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) 

import A 
import B 
obj1 = A.SomeClass() 
obj2 = B.AnotherClass() 
obj2.func(obj1) 

私は次のエラーを取得する:今、私は次のPythonスクリプトを実行します。誰かがこれを解決するためのアイデアを持っていますか?

答えて

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) 
    ; 
} 

"boost::python::" プレフィックスの挿入を注意してくださいclass_<...>文の上にそれぞれに2つの宣言のうちの1つ。

+0

こんにちは、どうもありがとうございました。しかし、私は継承関係のない2つのクラスについてこの問題を解決したいと思います。たとえば、 'SomeClass'は実際には 'Triangle'クラスで、 'AnotherClass'は 'Polygon'クラスであると想像できます。私は間違いなくPolygonがTriangleから継承しないようにしたいと思います。OOの観点からは意味をなさないからです。ですから、私は元の例のように、互いに継承していない異なるモジュールに2つのクラスを持たせることができますが、それらはPythonでお互いを使用していますか? – Arjan

+0

'func()'は 'SomeClass'引数を必要とします。 'AnotherClass'のように別のものを渡したいならば、AnotherClass'を引数として' SomeClass'にコンストラクタを追加することによって 'AnotherClass'を' SomeClass'から継承させることなく**することができます。代わりに、 'AnotherClass'引数を受け入れ、' SomeClass'インスタンスを返したものを書くこともできますが、明示的に呼び出す必要があります。そのようなことをすることができない場合、私はあなたが立ち往生していると思っています - とにかく 'func()'とは何か、何も知らない任意のクラスを渡せば? – martineau

+0

はい、私は理解していますが、この関数と異なる何かを渡したくない、SomeClass型の引数だけを渡したいと思います。 Pythonスクリプトの例では、私のobj1はA.SomeClass型です。 B.AnotherClassとは無関係です。 B.AnotherClassの 'func'は、obj1などのA.SomeClass型のパラメータを受け入れる必要があります。 – Arjan

6

私は最近、Boost.Pythonを試してみたところ、同じ問題がありました。次のdocの

チェックアウトセクション6:

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

6.1 - 動的バイナリ

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

私は静的バイナリを使用していて、取得していたのと同じタイプのエラーが発生しました。動的バイナリに変更すると、コンパイルされて正常に動作しました。

関連する問題