将Python嵌入C - 导入模块

7 投票
2 回答
9082 浏览
提问于 2025-04-17 01:14

我在使用嵌入式Python和C语言时遇到了一些问题,具体是按照文档的说明来做的。每当我尝试使用导入的模块时,就会出现以下错误:

在PythonIncl.exe的0x1e089e85处发生未处理的异常:0xC0000005: 访问冲突,读取位置0x00000004。

这个错误发生在PyObject_GetAttrString()这个方法里,而文档对此并没有太多帮助。我也尝试过一些教程,比如IBM的示例,但总是遇到同样的访问冲突。

以下是我从其中一个教程中得到的示例代码,但我似乎无法让它正常工作,问题出在哪里呢?

C语言代码(在一个主文件中):

#include <Python.h>
int main()
{
    PyObject *strret, *mymod, *strfunc, *strargs;
    char *cstrret;
    Py_Initialize();
    mymod = PyImport_ImportModule("reverse");
    strfunc = PyObject_GetAttrString(mymod, "rstring");
    strargs = Py_BuildValue("(s)", "Hello World");
    strret = PyEval_CallObject(strfunc, strargs);
    PyArg_Parse(strret, "s", &cstrret);
    printf("Reversed string: %s\n", cstrret);
    Py_Finalize();
    return 0;
}

Python代码(在一个叫reverse.py的文件中,和主文件在同一个文件夹):

def rstring(s):
    i = len(s)-1
    t = ''
    while(i > -1):
        t += s[i]
        i -= 1
    return t

我在使用XP系统,搭配MSVS2008和Python 2.7。

稍微解释一下背景:我想在一个比较大的C程序中嵌入一个小的Python脚本,这个脚本使用了OpenOPC,并希望在两者之间传输数据。然而,我在进行基本示例的概念验证测试时就已经失败了。

2 个回答

2

你在运行代码的时候没有检查错误,所以代码出问题也不奇怪。从你的描述来看,mymod 可能是 NULL,这说明导入失败了。导致导入失败的一个可能原因是你发的 reverse.py 文件里面有语法错误。

16

检查一下PyImport_ImportModule这个调用的结果:它失败了,返回了NULL。这是因为默认情况下,当前目录不在搜索路径中。你需要添加

PySys_SetPath("."); // before ..
mymod = PyImport_ImportModule("reverse");

来把当前目录加入到模块的搜索路径里,这样你的例子就能正常工作了。

撰写回答