1

Py++を使用してC++クラスをラップしましたが、Pythonではすべてがうまく機能しています。c ++クラスをインスタンス化したり、メソッドを呼び出したりすることができます。

現在、PythonをC++アプリケーションに埋め込もうとしています。これは、ほとんどの場合、正常に機能しています。Pythonモジュールで関数を呼び出したり、戻り値を取得したりできます。

私が呼び出しているPythonコードは、ラップしたクラスの1つを返します。

import _myextension as myext
def run_script(arg):
    my_cpp_class = myext.MyClass()
    return my_cpp_class

私はこの関数をC++から次のように呼び出しています:

// ... excluding error checking, ref counting, etc. for brevity ...
PyObject *pModule, *pFunc, *pArgs, *pReturnValue;

Py_Initialize();
pModule = PyImport_Import(PyString_FromString("cpp_interface"));
pFunc = PyObject_GetAttrString(pModule, "run_script");
pArgs = PyTuple_New(1); PyTuple_SetItem(pArgs, 0, PyString_FromString("an arg"));


pReturnValue = PyObject_CallObject(pFunc, pArgs);

bp::extract< MyClass& > extractor(pReturnValue); // PROBLEM IS HERE
if (extractor.check()) {                         // This check is always false
    MyClass& cls = extractor();
}

問題は、extractorが実際にPyObject *をMyClassに抽出/変換しないことです(つまり、extractor.check()は常にfalseです)。

ドキュメントによると、これはラップされたC++クラスを抽出する正しい方法です。

Python関数から基本的なデータ型(ints / floats / dicts)を返そうとしましたが、すべて正しく抽出されています。

足りないものはありますか?データを取得してMyClassにキャストする別の方法はありますか?

4

1 に答える 1

1

エラーが見つかりました。バインディングは Python 拡張のみを作成する別のプロジェクトでコンパイルされたため、メインの実行可能ファイルにバインディングをリンクしていませんでした。

バインディングを使用して拡張機能をpModule = PyImport_Import(PyString_FromString("cpp_interface"));ロードすると、同様にロードされると想定しましたが、そうではありません。

この問題を解決するために、boost::python バインディングを含むファイル (私にとっては wrapper.cpp のみ) をメイン プロジェクトに追加し、再構築しました。

于 2013-01-23T18:12:16.670 に答える