【发布时间】:2022-01-01 21:46:59
【问题描述】:
我正在尝试从 C 程序运行一个简单的 Python 代码,但在 pArgs = Py_BuildValue("s",(char*)"Greg"); 行出现分段错误
这是我要运行的python代码:
def main(person):
return "What's up " + person;
这是我的 C 程序:
#include <stdio.h>
#include <Python.h>
void main(void) {
Py_Initialize();
PyObject *pName, *pModule, *pFunc, *pArgs, *pValue;
pName = PyUnicode_FromString((char*)"main");
pModule = PyImport_Import(pName);
pFunc = PyObject_GetAttrString(pModule, (char*)"main");
pArgs = Py_BuildValue("s",(char*)"Greg");
pValue = PyObject_CallObject(pFunc, pArgs);
Py_Finalize();
return;
}
我正在开发 Ubuntu 20.4
从Idle启动的python代码可以运行,文件在同一目录下python文件名为main.py
你能告诉我我做错了什么吗?
【问题讨论】:
-
为了排除其他可能的问题,您应该检查所有 C API 调用的返回值是否为 NULL,以防出现问题。 Py_BuildValue 中的崩溃可能是之前发生的内存损坏的结果。
-
在调试器中运行应该很容易调试。段错误发生在哪一行?正如其他人指出的那样,这些调用中的任何一个都可能失败,因为您从不检查返回值。例如,如果
pModule == NULL,那么下一个获取属性的调用将会出错。 -
另外,我不相信
PyImport_Import默认使用当前目录(我可能是错的)。如果是这样,那么如果不将当前目录添加到PYTHONPATH,main.py将无法导入。 -
嗨,我用 GDB 一步一步开始了代码,pModule 返回 NULL。我试图通过在
Py_Initialize();行之后添加行PySys_SetPath(L".");来解决此问题,但我遇到了同样的问题。