在c ++中嵌入python:分段错误[重复]

Posted

技术标签:

【中文标题】在c ++中嵌入python:分段错误[重复]【英文标题】:Embedding python in c++: Segmentation fault [duplicate] 【发布时间】:2018-02-18 15:29:30 【问题描述】:

我在 Linux 设备 (raspberry pi/raspbian) 上使用 Visual Studio 远程调试 c++ 应用程序。在这个 c++ 应用程序中,我通过使用 Python/c api 加载函数来嵌入一个简单的 Python 脚本。这是我的 C++ 代码:

#include <Python.h>

int main(int argc, char* argv[])

PyObject *pName, *pModule, *pDict, *pFunc, *pValue;

// Initialize the Python Interpreter
Py_Initialize();

// Build the name object
pName = PyUnicode_FromString("//home//pi//projects//InfoBeam//WebScraperPython.txt");

// Load the module object
pModule = PyImport_Import(pName);

// pDict is a borrowed reference 
pDict =  PyModule_GetDict(pModule);

// pFunc is also a borrowed reference 
pFunc = PyDict_GetItemString(pDict, "pyMain");

if (PyCallable_Check(pFunc))

    PyObject_CallObject(pFunc, NULL);

else

    PyErr_Print();


// Clean up
Py_DECREF(pModule);
Py_DECREF(pName);

// Finish the Python Interpreter
Py_Finalize();

return 0;

问题是,我在运行 PyModule_GetDict(pModule) 函数时遇到了分段错误。我究竟做错了什么?这是错误信息:

程序收到信号SIGSEGV,分段错误。 PyModule_GetDict() 中的 0x76bfdd28 来自 /usr/lib/arm-linux-gnueabihf/libpython3.5m.so.1.0 分段错误

编辑:好的,pModule 确实为 NULL,可能是因为 PyUnicode_FromString 失败。由于 PyImport_Import 失败:我需要在哪里保存我的脚本,或者:我如何将 api 的信息传递给它?

【问题讨论】:

我在您的代码中没有看到任何错误检查。 pModule 可能为空?还有为什么"//"?与"\\" 不同,Is 不是转义序列。无需转义右斜线。 【参考方案1】:

在调用 PyModule_GetDict 之前,请检查 pModule 是否为 NULL。这意味着PyImport_Import 无法导入模块(路径等问题......)

【讨论】:

好的,pModule 确实为 NULL,可能是因为 PyUnicode_FromString 失败。 Python脚本的路径如何正确?我只需要提供文件名而不是路径吗?我编辑了反斜杠,但这没有帮助。 PyImport_Import 不是在寻找文件名。它正在寻找类似 @​​987654325@ 的东西(即你在 Python import 语句中输入的内容) 调试的时候看到,那个pName是持有一个地址,但是由于pyImport_import失败,肯定是一个错误的地址。所以很明显,作为 PyUnicode_FromString 的参数的路径一定是错误的。但我想不出那里有错误,因为我尝试了许多版本的路径。

以上是关于在c ++中嵌入python:分段错误[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中嵌入 python:奇怪的分段错误

在 C 中嵌入 Python:链接错误 - 未定义对 PyString_AsString 的引用

在嵌入Python解释器的应用程序中调试tk85.dll中的问题

python中的分段错误[重复]

python跟踪分段错误

为啥在使用 Python/C API 时会出现此段错误?