[英]Coupled fortran/c++ with pointer called in python gives a Segmentation fault (core dumped) error
[英]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.