0

ブーストを使用して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 ファイルからコンバーターを登録することは可能ですか?

ありがとう

4

0 に答える 0