在我的 Ubuntu 下:
$猫测试.py
#Filename test.py
def Hello():
print "Hello, world!"
Run Code Online (Sandbox Code Playgroud)
$猫tom.cpp
#include <Python.h>
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;
}
Run Code Online (Sandbox Code Playgroud)
然后编译它:
g++ tom.cpp -I/usr/include/python2.7 -L/usr/lib/python2.7 -lpython2.7
Run Code Online (Sandbox Code Playgroud)
运行:$ ./a.out
Segmentation fault
Run Code Online (Sandbox Code Playgroud)
为什么?有人可以帮忙吗?谢谢!
BR,汤姆
上一张海报可能是对的,所以我的评论更“通用”……但是在 C/C++ 中,在尝试取消引用之前,您不应该在没有确认它不是 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);
Run Code Online (Sandbox Code Playgroud)
该问题是由PyObject_GetAttrString返回NULL. 我还添加了目录路径,PyRun_SimpleString因为我的开发目录不在 python 路径下
#include <Python.h>
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;
}
Run Code Online (Sandbox Code Playgroud)