从阅读另一个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命令或任何调试器调用它来检查堆栈并查看失败的位置发生。 –