2009-06-02 11 views
4

私はC++/Pythonの混合言語プログラミングには新しく、Python/C APIについてよく考えていません。私はBoost.Pythonを使ってPython用のC++ライブラリをラップし始めました。私は引数として配列へのポインタを取る関数をラップすることに固執しています。次の(2番目のctor)はC++のプロトタイプです。ラップされたC++関数のためにPythonで配列へのポインタを渡す方法

class AAF{ 
    AAF(AAF_TYPE t); 
    AAF(double v0, const double * t1, const unsigned * t2, unsigned T); 
    ~AAF(); 
} 

私はこのようにboost :: pythonでこれをラップしていますか?

class_<AAF>("AAF", init<AAF_TYPE>()) 
    .def(init<double, const double*, const unsigned*, unsigned>()); 

正常にコンパイルされてリンクされていることに注意してください。ただし、Pythonで呼び出す方法はわかりませんでした。私の素朴な試みは次のように失敗しました。

>>> z = AAF(10, [4, 5.5, 10], [1, 1, 2], 3); 

Traceback (most recent call last): 
    File "./test_interval.py", line 40, in <module> 
    z = AAF(10, [4, 5.5, 10], [1, 1, 2], 3); 
Boost.Python.ArgumentError: Python argument types in 
    AAF.__init__(AAF, int, list, list, int) 
did not match C++ signature: 
    __init__(_object*, AAF_TYPE) 
    __init__(_object*, double, double const*, unsigned int const*, unsigned int) 

>>> t1 = array.array('d', [4, 5.5, 10]) 
>>> t2 = array.array('I', [1, 1, 2]) 
>>> z = AAF(10, t1, t2, 3); 

Traceback (most recent call last): 
    File "./test_interval.py", line 40, in <module> 
    z = AAF(10, t1, t2, 3); 
Boost.Python.ArgumentError: Python argument types in 
    AAF.__init__(AAF, int, array.array, array.array, int) 
did not match C++ signature: 
    __init__(_object*, AAF_TYPE) 
    __init__(_object*, double, double const*, unsigned int const*, unsigned int) 

私の2番目の質問は、デストラクタもラップする必要がありますか?これが必要な場合があるかどうかを明記してください。

答えて

4

ラッピングはあなたがあなたの関数のPythonのリストオブジェクトではなく、ポインタを渡している(通訳が指摘するように)(原則として)、右が、

AAF(10, [4, 5.5, 10], [1, 1, 2], 3); 

です。

要するに、関数がPythonのリストで作業する必要がある場合は、ポインタを使用する代わりにそのインタフェースを使用するようにコードを変更する必要があります。そのインタフェースを維持する必要がある場合は、Pythonからリストを取得し、適切な変換を行い、オリジナルのC++関数を呼び出すラッパー関数を記述する必要があります。 numpy配列にも同じことが言えます。

boost :: pythonには、Pythonコンテナをstl互換コンテナに変換するための組み込みのメカニズムがいくつか用意されています。あなたのケースのための

例のラッピングコードは

void f(list o) { 
    std::size_t n = len(o); 
    double* tmp = new double[n]; 
    for (int i = 0; i < n; i++) { 
     tmp[i] = extract<double>(o[i]); 
    } 
    std::cout << std::endl; 
    // use tmp 
    delete tmp; 
} 

可能性がありhttp://www.boost.org/doc/libs/1_39_0/libs/python/doc/tutorial/doc/html/index.htmlでboost.pythonのチュートリアルを見て与えてください。

+0

返信いただきありがとうございますが、私が言ったように、私はPython/C APIについてあまり知りません。 PythonのリストをC++配列に変換する方法を見つけることができるようにどこかを指摘できますか? – Aamir

+0

この場合、 "to C array"と言うでしょうが、いくつかのサンプルコードを追加しました。 – andreabedini

関連する問題