繁体   English   中英

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

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

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

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

以下是我的代码。

主文件

#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();

      

}

脚本.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 <Python.h> 一直给我带来麻烦,是的,我已经尝试过 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 回溯打印到屏幕上,然后退出。 您可以使用此回溯来找出您的错误是什么。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM