将 Python 嵌入到 C++ 接收错误分段错误(核心已转储)

Embedding Python to C++ Receiving Error Segmentation fault (core dumped)

这是我第一次尝试在 C++ 中嵌入 Python。

我只是想创建一个简单的程序,以便了解它的工作原理。

以下是我的代码。

main.cpp

#define PY_SSIZE_T_CLEAN
#include </usr/include/python3.8/Python.h>
#include <iostream>


int main(int argc, char *argv[]){
    
    PyObject *pName, *pModule, *pFunc, *pArgs, *pValue;

    Py_Initialize();


    pName = PyUnicode_FromString((char*)"script");
    pModule = PyImport_Import(pName);
    pFunc = PyObject_GetAttrString(pModule, (char*)"test");
    pArgs = PyTuple_Pack(1, PyUnicode_FromString((char*)"Greg"));
    pValue = PyObject_CallObject(pFunc, pArgs);
    
    auto result = _PyUnicode_AsString(pValue);
    std::cout << result << std::endl;

    Py_Finalize();

      

}

script.py

def test(person):
    return "What's up " + person;

这就是我在 Linux

上编译的方式
g++ -I/usr/include/python3.8/ main.cpp -L/usr/lib/python3.8/config-3.8-x86_64-linux-gnu -lpython3.8 -o output

我这样编译是因为(#include 一直给我带来麻烦,是的,我试过 sudo apt-get install python3.8-dev)

文件编译成功,但是当我尝试 运行 ./output 时,我收到以下错误。

Segmentation fault (core dumped)

我搜索了一下这个错误是什么意思,它说分段错误是一种特定类型的错误,由访问“不属于你”的内存引起。

可是哪一段记忆不属于我?是 python 文件吗?

任何指导将不胜感激。

在这些语句中的每一个之后,您将需要使用以下形式检查错误:

if (varname == NULL) {
    cout << “An error occured” << endl;
    PyErr_Print();
    return EXIT_FAILURE;
 }

这将检查python层是否通过错误;如果是这样,将要求它在屏幕上打印 Python traceback,然后退出。您可以使用此回溯来找出错误所在。

这些功能中的任何一个都可能失败,您需要在继续之前检查是否失败。因此,使用 Python C API 非常繁琐。大多数 C API 函数 return 一个指针 return 出错时为 NULL,并且将 NULL 传递给任何函数而不首先检查它必然会导致崩溃。

访问 NULL 指针会导致分段错误,因为几乎所有现代系统都将对 NULL 的访问映射到分段错误或某种崩溃以捕获编程错误。