【问题标题】:How to solve the 'Segmentation fault' when hybrid programming of C & Python?如何解决 C 和 Python 混合编程时的“分段错误”?
【发布时间】:2012-03-22 15:04:08
【问题描述】:

在我的 Ubuntu 下:

$ cat test.py

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

$ cat 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; 
} 

然后编译:

g++ tom.cpp -I/usr/include/python2.7 -L/usr/lib/python2.7 -lpython2.7

运行: $ ./a.out

Segmentation fault

为什么? 有人可以帮忙吗? 谢谢!

BR, 汤姆

【问题讨论】:

    标签: python c


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      问题是由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;
      }
      

      【讨论】:

      • @snibu 首先感谢您的回答,但完全使用此代码以及同一文件夹中的所有 python 和 c++ 文件,但我仍然分段错误?你能帮我吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-12
      • 1970-01-01
      相关资源
      最近更新 更多