От чтения другого post, я пытаюсь embbed некоторого кода Python в C:Вложение Python в C - Segfault
main.c
#include <Python.h>
int callModuleFunc(int array[], size_t size) {
PyObject *mymodule = PyImport_ImportModule("py_function");
PyObject *myfunc = PyObject_GetAttrString(mymodule, "printlist");
PyObject *mylist = PyList_New(size);
for (size_t i = 0; i != size; ++i) {
PyList_SET_ITEM(mylist, i, PyInt_FromLong(array[i]));
}
PyObject *arglist = Py_BuildValue("(o)", mylist);
PyObject *result = PyObject_CallObject(myfunc, arglist);
int retval = (int)PyInt_AsLong(result);
Py_DECREF(result);
Py_DECREF(arglist);
Py_DECREF(mylist);
Py_DECREF(myfunc);
Py_DECREF(mymodule);
return retval;
}
int main(int argc, char *argv[])
{
int a[] = {1,2,3,4};
callModuleFunc(a, 4);
return 0;
}
py_function.py
'''py_function.py - Python source designed to '''
'''demonstrate the use of python embedding'''
def printlist(mylist):
print mylist
Затем я составил:
gcc main.c -I/usr/include/python2.7 -lpython2.7
Но тогда я побежал приложение, он дает мне ошибку ошибки сегментации:
/a.out
[1] 18890 segmentation fault ./a.out
Есть ли что-то, что мне не хватает?
Вы назначаете целую кучу указателей из возвращаемых значений функции вызовы, но не проверяйте их достоверность перед их использованием. Вы также можете смешивать типы - вы получаете предупреждения о компиляции? (Хотя в C даже отсутствие такого не подразумевает, что таких проблем нет). Вы также можете рассмотреть возможность запуска вашей программы под отладчиком, а затем с помощью команды backtrace или того, что ваш отладчик вызывает для проверки стека, и посмотрите, где произошел сбой произошло. –