2011-10-27 15 views
1

私は2つのクラス、最初は "Radish"と呼ばれ、2番目は "RadishCont"と呼ばれます。 すべてのコードはC++で書かれており、Pythonで使用する必要があります。boost :: pythonとswigの統合

大根はSWIGを使用してPythonに公開されています。代わりに、RadishContはboost :: pythonを使って公開されています。

私はこの構文を持つクラスのRadishContにメソッドを追加する必要があります。「大根」はRadishContに含まれている大根のインスタンスである

Radish* get_radish() 
{ 
    return &radish; 
} 

私はPythonのコードを実行すると、私はこの例外を受け取る:

だから、
TypeError: No Python class registered for C++ class Radish 

、私の質問は:どのように私はSWIGを使ってRadishContを書き換えることなく、Pythonで、この方法で作業を行うことができますか?

答えて

0

は、私はそれを行っています。

私はこのように私のブーストのpythonモジュールでクラスのインスタンスを作成している:私はこのようなコンバータ機能を作成している

class_<Radish>("Radish"); 

PySwigObjectはこのような構造体である
static void* radishConvert(PyObject* obj) 
{ 
    char thisStr[] = "this"; 
    //first we need to get the this attribute from the Python Object 
    if (!PyObject_HasAttrString(obj, thisStr)) 
      return NULL; 

    PyObject* thisAttr = PyObject_GetAttrString(obj, thisStr); 
    if (thisAttr == NULL) 
      return NULL; 
    //This Python Object is a SWIG Wrapper and contains our pointer 
    void* pointer = ((PySwigObject*)thisAttr)->ptr; 
    Py_DECREF(thisAttr); 
    return pointer; 
} 

struct PySwigObject 
{ 
    PyObject_HEAD 
    void * ptr; 
    const char * desc; 
}; 

最後に、私のコンバータを登録しました:

boost::python::converter::registry::insert(&radishConvert, type_id<Radish>()); 

これは完全に機能し、私はSWIGからオブジェクトを取得してboost :: pythonに渡すことができます。逆のプロセスはまだ解決されていませんが、私にとっては十分です。

これは私が解決策を見つけるために使用しているガイドです: http://wiki.python.org/moin/boost.python/HowTo#SWIG_exposed_C.2B-.2B-_object_from_Python

2

新しい機能を組み込むためにSWIGインターフェイスを書き直す方が良いと思います。 SWIGはboost :: pythonsシステムと互換性のないクラス/関数用の内部登録システムを使用しています。

0

このエラーはBoost.Pythonから発生します。 BPのタイプテーブルにはRadishのエントリがありません。エントリーがなければ、BPが何をすべきかを知る方法はありません。エントリを取得する唯一の方法は、BPでRadishをラップすることです。

私は、BPとSWIGが単に協力し合わないことを恐れています。大規模なハッキングを除き、あなたが望むように働かせることは非常に疑問です。私は最後にはあなたがどちらか一方のライブラリにあなたの全体のシステムを移動することをお勧めします、または他の

関連する問題