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にキャストする別の方法はありますか?