在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:链接错误 - 未定义对 PyString_AsString 的引用