ブーストを使用してC++クラスをPythonに公開し、Pythonで定義されたオブジェクトをC++側で抽出しようとしています。
ファイル MyInt.h で C++ クラスを定義しました。
struct MyInt
{
int i_;
};
プロジェクトで BOOST_PYTHON_MODULE を定義すると、すべて正常に動作します。たとえば、次のコードはうまく機能します。
#include "MyInt.h"
BOOST_PYTHON_MODULE(Example)
{
bpy::class_<MyInt>("MyInt")
.def_readwrite("i_", &MyInt::i_);
}
int main()
{
PyImport_AppendInittab("Example", &PyInit_Example);
Py_Initialize();
try
{
bpy::object main_module = bpy::import("__main__");
bpy::object main_namespace = main_module.attr("__dict__");
main_namespace["ex"] = bpy::import("Example");
bpy::exec("i = ex.MyInt()", main_namespace, main_namespace);
bpy::exec("i.i_ = 5", main_namespace, main_namespace);
MyInt& myI = bpy::extract<MyInt&>(main_namespace["i"]);
std::cout << "MyI.i_ : " << myI.i_ << std::endl;
}
catch (bpy::error_already_set& pye)
{
PyErr_Print();
}
Py_Finalize();
system("Pause");
}
ここで、同じ BOOST_PYTHON_MODULE を使用して Example.pyd ファイルをビルドすると、それを Python にインポートできますが、C++ の次のコードは機能しません。
#include "MyInt.h"
int main()
{
HMODULE hLib = LoadLibrary("Example.pyd");
if (hLib)
{
typedef PyObject* (*PFN) ( void);
PFN init_func = (PFN)GetProcAddress(hLib,"PyInit_Example");
if (init_func != 0)
{
int y = 0;
if ((y = PyImport_AppendInittab("Example", init_func)) == -1)
{
std::cout << "PyImport failed" << std::endl;
}
}
}
Py_Initialize();
try
{
bpy::object main_module = bpy::import("__main__");
bpy::object main_namespace = main_module.attr("__dict__");
main_namespace["ex"] = bpy::import("Example");
bpy::exec("i = ex.MyInt()", main_namespace, main_namespace);
bpy::exec("i.i_ = 5", main_namespace, main_namespace);
MyInt& myI = bpy::extract<MyInt&>(main_namespace["i"]);
std::cout << "MyI.i_ : " << myI.i_ << std::endl;
}
catch (bpy::error_already_set& pye)
{
PyErr_Print();
}
Py_Finalize();
system("Pause");
if (hLib) FreeLibrary(hLib);
}
PyImport_AppendInitTab は問題ないようですが、次のエラーがスローされます。
TypeError:登録されたコンバーターは、MyInt 型のこの Python オブジェクトから struct MyInt 型への C++ 参照を抽出できませんでした
このエラーを修正するにはどうすればよいですか? pyd ファイルからコンバーターを登録することは可能ですか?
ありがとう