從閱讀另一個post,我想embbed一些一些Python代碼到C:Python嵌入使用C - 段錯誤
的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命令或任何調試器調用它來檢查堆棧並查看失敗的位置發生。 –