将Python嵌入C - 导入模块

7
我在使用嵌入式Python for C时遇到了问题,按照文档的说明进行操作。每当我尝试使用导入的模块时,就会出现以下错误:

Unhandled exception at 0x1e089e85 in PythonIncl.exe: 0xC0000005: Access violation reading location 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

我正在使用MSVS2008和Python 2.7的XP机器。一些背景信息:我试图将使用OpenOPC的小型Python脚本嵌入到相当大的C程序中,并希望在两者之间传输数据。但是,即使是最基本的示例也已经失败了。

2
你知道在Python中必须缩进while循环的主体吗? - Griwes
1
编写 Python 的扩展程序通常比嵌入 Python 更加美观和强大。两者看起来很相似,但是编写扩展有更好的工具支持,需要时更容易访问其他 Python 工具。访问 http://twistedmatrix.com/users/glyph/rant/extendit.html 了解有关扩展与嵌入的观点。 - Mike Graham
是的,关于缺少的缩进,那只是在发布过程中丢失了,它在IDE中存在。 - Shorkaa
2个回答

16

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

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

要将当前目录添加到模块搜索路径并使您的示例运行,请执行以下操作。


1
PySys_SetPath(".") 清除/覆盖搜索路径。最好是追加到它上面。 - Leon

2

您没有检查错误就继续进行,所以您的代码以这种方式失败并不令人惊讶。根据您的描述,mymod 似乎是 NULL,这与导入失败一致。导入失败的一个可能原因是您发布的 reverse.py 存在语法错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接