0

我正在尝试使用 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 文件注册转换器?

谢谢

4

0 回答 0