Я пытаюсь использовать 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.