Через код, написанный на C ++, код, который встраивает python, вызывает внешний класс python и выполняет метод этого класса (FileHandler). Это работает.
Я генерирую библиотеку этого кода на C ++ (libSome.so) для использования в python с c_types, и создание оболочки для попытки запустить вышеописанный метод приводит к ошибке сегментации. Есть идеи?
(C ++) Это встроенный код, который затем создается в виде общей библиотеки (libSome.so):
...
/* Funcion de python */
setenv("PYTHONPATH", ".", 1);
Py_Initialize();
PyObject* module = PyImport_ImportModule("filehandler");
assert(module != NULL);
PyObject* class = PyObject_GetAttrString(module, "FileHandler");
assert(class != NULL);
PyObject* inst = PyInstance_New(class, NULL, NULL);
assert(inst != NULL);
result = PyObject_CallMethod(inst, (char*)"write", (char*)"(iiii)",ori,serv, id, timeStamp);
assert(result != NULL);
Py_Finalize();
(Python) код, используемый библиотекой
import os
class FileHandler:
def __init__(self):
self.workingDirectory = os.getcwd()
pass
def write(self, NodoOrigen, Servicio, Id, payload):
try:
os.mkdir(str(NodoOrigen))
except:
pass
os.chdir(str(NodoOrigen)+"/")
try:
os.mkdir(str(Servicio))
except:
pass
os.chdir(self.workingDirectory)
os.chdir(str(NodoOrigen)+"/"+str(Servicio)+"/")
try:
f = open(str(Id),"a")
except:
print "No se puede abrir el archivo"f.write(str(payload))
f.close()
os.chdir(self.workingDirectory)
Я не уверен, что это ваша проблема, поскольку здесь не достаточно информации, но ctypes предназначен только для вызова функций C; чтобы вызвать функции C ++, вам нужно обернуть ваши функции C ++ функцией в extern "C"
блок.
Для примера этого посмотрите этот ответ: https://stackoverflow.com/a/145649/121714
Я думаю, что проблема может быть с вашим использованием PyInstance_New
: https://mail.python.org/pipermail/python-list/2003-March/195516.html
Возможно попробуйте это вместо этого:
PyObject * inst = PyObject_CallObject (class, NULL);
и заставить FileHandler наследовать от объекта в вашем коде Python.
Класс FileHandler (объект): ...
Это ваш реальный код? Если это C ++, он не должен позволять вам использовать переменную с именем class
, а также assert(instance != NULL);
должен прочесть assert(inst != NULL);
Кроме того, какая строка на самом деле вызывает segfault?
Другая возможность: если вы начинаете это с Python, а затем вызываете C ++, который вызывает Python, код C ++ не должен вызывать Py_Initialize();
или же Py_Finalize();
(однако, если у вас есть приложение C ++, встраивающее Python, это было бы хорошо)