将 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 的访问映射到分段错误或某种崩溃以捕获编程错误。
这是我第一次尝试在 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
文件编译成功,但是当我尝试 运行 ./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 的访问映射到分段错误或某种崩溃以捕获编程错误。