вызов метода python из c ++ «библиотека»

Через код, написанный на 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)

-3

Решение

Я не уверен, что это ваша проблема, поскольку здесь не достаточно информации, но ctypes предназначен только для вызова функций C; чтобы вызвать функции C ++, вам нужно обернуть ваши функции C ++ функцией в extern "C" блок.

Для примера этого посмотрите этот ответ: https://stackoverflow.com/a/145649/121714

0

Другие решения

Я думаю, что проблема может быть с вашим использованием 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, это было бы хорошо)

0

По вопросам рекламы [email protected]