How to solve the 'Segmentation fault' when hybrid programming of C & Python?

前端 未结 2 1562
逝去的感伤
逝去的感伤 2021-01-13 16:37

Under my Ubuntu:

$ cat test.py

#Filename test.py 
def Hello(): 
    print \"Hello, world!\" 

$ cat tom.cpp

#inclu         


        
相关标签:
2条回答
  • 2021-01-13 17:03

    The previous poster is probably right, so my comment is more "generic"...but in C/C++, you should NEVER accept a pointer back from a function without confirming it's not NULL before attempting to de-refence it. The above code should more rightly be:

     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); 
    
    0 讨论(0)
  • 2021-01-13 17:17

    The issue is caused by PyObject_GetAttrString returning NULL. I have also added the directory path using PyRun_SimpleString as my dev dir was not under python path

    #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;
    }
    
    0 讨论(0)
提交回复
热议问题