如何解决C&Python混合编程时的“分段故障”?
在我的Ubuntu下:
$ cat test.py
#Filename test.py def Hello(): print "Hello, world!"
$ cat tom.cpp
#include int main() { Py_Initialize(); PyObject * pModule = NULL; PyObject * pFunc = NULL; pModule = PyImport_ImportModule("test"); pFunc = PyObject_GetAttrString(pModule, "Hello"); PyEval_CallObject(pFunc, NULL); Py_Finalize(); return 0; }
然后编译它:
g++ tom.cpp -I/usr/include/python2.7 -L/usr/lib/python2.7 -lpython2.7
运行:$ ./a.out
Segmentation fault
为什么? 有人可以帮忙吗? 谢谢!
BR,汤姆
上一张海报可能是正确的,所以我的评论更“通用”……但在C / C ++中,你不应该接受一个函数指针,而不会在尝试去reflection它之前确认它不是NULL。 上面的代码应该更正确:
pModule = PyImport_ImportModule("test"); if (pModule == NULL) { printf("ERROR importing module"); exit(-1); } pFunc = PyObject_GetAttrString(pModule, "Hello"); if (pFunc == NULL) { printf("ERROR getting Hello attribute"); exit(-1); } PyEval_CallObject(pFunc, NULL);
问题是由PyObject_GetAttrString返回NULL引起的。 我还使用PyRun_SimpleString添加了目录路径,因为我的dev dir不在python路径下
#include int main() { Py_Initialize(); PyRun_SimpleString ("import sys; sys.path.insert(0, 'add the directory path here')"); PyObject * pModule = NULL; PyObject * pFunc = NULL; pModule = PyImport_ImportModule("test"); pFunc = PyObject_GetAttrString(pModule, "Hello"); if(pFunc != NULL) { PyEval_CallObject(pFunc, NULL); Py_Finalize(); } else { printf("pFunc returned NULL\n"); } return 0; }