如何解决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; }