Boost Python: не соответствует сигнатуре C ++ при возврате объекта экспорта c ++ - PullRequest
1 голос
/ 02 марта 2020

Я пытаюсь использовать python, расширить мой код на C ++, а затем использовать boost. python для экспорта данных структуры из c ++, но перехватывать исключение "error_already_set" при передаче аргументов либо c ++, либо python.

C ++ Код экспорта:


    class TestData
    {
    public:
        int val = 0;
    };

    class World
    {
    public:
        void greet(const TestData& td) {
            cout << "value: " << td.val << endl;
        }
    };

    void DoIt(World& w)
    {
        // do something
    }

    BOOST_PYTHON_MODULE(PyGameExport)
    {
        boost::python::class_<World>("World")
            .def("greet", &World::greet)
            ;

        boost::python::class_<TestData>("testData", boost::python::init<>())
            .def_readwrite("val", &TestData::val);

        boost::python::def("doIt", &DoIt);
    }

Person.py


    import PyGameExport as py

    def some_func(world):
        py.doIt(world)

    class Person:
        def greetReset(self, instance):
            d = py.testData()
            d.aa=777
            instance.greet(d)

Question1: python функция не может передать параметры объекта в C ++


    void test_function2()
    {
        Py_Initialize();
        PyInit_PyGameExport();

        using namespace boost::python;
        try {

            PyObject *pModule = PyImport_ImportModule("Person");
            if (!pModule) {
                std::cout << PythonException::parse_python_exception() << std::endl;
                return;
            }

            World world;
            boost::python::call_method<void>(pModule, "some_func", boost::ref(world));
        }
        catch (error_already_set) {
            PyErr_Print();
        }
    }

Questrion2: функция члена класса python не может создать экспортированный объект C ++ и передать его в C ++


    void test_function1()
    {
        Py_Initialize();
        PyInit_PyGameExport();

        using namespace boost::python;
        try {

            PyObject *pModule = PyImport_ImportModule("Person");
            if (!pModule) {
                std::cout << PythonException::parse_python_exception() << std::endl;
                return;
            }

            boost::python::handle<> module(pModule);
            boost::python::object main_module(module);
            boost::python::object main_namespace = main_module.attr("__dict__");


            PyObject* py_obj = NULL;
            py_obj = PyRun_String("Person()", Py_eval_input, main_namespace.ptr(), main_namespace.ptr());
            if (!py_obj)
                return;

            World world;
            boost::python::call_method<void>(py_obj, "greetReset", boost::ref(world));
        }
        catch (error_already_set) {
            PyErr_Print();
        }
    }

Исключение:

``

Traceback (most recent call last):
  File "D:\git_dev_home\proj_server\product\Debug\Person.py", line 12, in greetR
eset
    instance.greet(d)
Boost.Python.ArgumentError: Python argument types in
    World.greet(World, testData)
did not match C++ signature:
    greet(class World {lvalue}, class TestData)


Thanks for your answer.
...