我正在尝试使用 boost 向 python 公开一个 c++ 类,并在 c++ 端提取一个在 python 中定义的对象。
我在文件 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 文件注册转换器?
谢谢