У меня есть модуль python с именем my_module, в нем есть класс my_class, а у my_class есть метод класса с именем my_method.
Основываясь на других примерах, которые я видел, я предпринял следующие попытки вызвать my_method из C ++, но в настоящее время все они возвращают NULL (фактически один из них — segfaults …)
Сначала я импортирую модуль и класс:
PyObject* my_module_name = PyString_FromString((char*)"my_module");
PyObject* myModule = PyImport_Import(my_module_name);
PyObject* my_class = PyObject_GetAttrString(myModule2, (char*)"my_class");
if (!my_class) std::cout << "my_class failed " << std::endl;
Затем я строю аргументы для передачи в виде кортежа:
// These are the args
PyObject* my_args = PyTuple_Pack(
5,
PyString_FromString((char*)"first string"),
PyString_FromString((char*)"next string"),
PyFloat_FromDouble(0.0),
PyFloat_FromDouble(1.0),
Py_False
);
if (!my_args) std::cout << "my_args failed " << std::endl;
Затем я пытаюсь вызвать фактический метод
PyObject* my_method = PyObject_GetAttrString(my_class,(char*)"my_method");
if (!my_method) std::cout << "failed " << std::endl;
// This returns NULL
PyObject* result_1 = PyObject_CallMethod(my_class, (char*)"my_method", "ssiib", my_args);
if (!result_1) std::cout << "failed result_1 " << std::endl;
// This returns NULL
PyObject* result_2 = PyObject_CallMethod(my_class, (char*)"my_method", "ssiib", my_args);
if (!result_2) std::cout << "failed result_2 " << std::endl;
// This returns NULL
PyObject* result_3 = PyObject_CallMethod(my_class, (char*)"my_method", "ssiib", "first string", "second string", 0.0, 1.0);
if (!result_3) std::cout << "failed result_3 " << std::endl;
// This one segfaults
PyObject* result_4 = PyObject_CallMethodObjArgs(my_class, my_method, my_args);
if (!result_4) std::cout << "failed result_4 " << std::endl;
// This returns NULL
PyObject* result_5 = PyObject_CallObject(my_method, my_args);
if (!result_5) std::cout << "failed result_5" << std::endl;
Но они возвращают NULL или в случае попытки номер 4, segfault.
Я в недоумении, что попробовать дальше, поэтому любая помощь будет принята с благодарностью.
Ура,
Джек
Задача ещё не решена.
Других решений пока нет …