C&Python混合编程时如何解决“分段错误”?

use*_*735 4 c python

在我的 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,汤姆

use*_*028 6

上一张海报可能是对的,所以我的评论更“通用”……但是在 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)


sni*_*ibu 6

该问题是由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)