【发布时间】:2016-06-07 19:30:06
【问题描述】:
通过阅读另一个post,我正在尝试将一些 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 命令或调试器调用的任何命令来检查堆栈并查看失败的位置发生了。
标签: python c segmentation-fault