2011-09-02 83 views
6

我使用的是嵌入式的Python C作为每Documentation有问题 - 每当我尝试使用导入的模块,我得到一个:Python嵌入成C - 导入模块

在PythonIncl.exe在0x1e089e85

未处理的异常: 0xC0000005: 访问冲突读取位置0x00000004。

该错误发生在PyObject_GetAttrString()方法和文档没有太大的帮助。我也尝试使用来自IBM的Example中的教程,但始终得到相同的访问冲突。

以下是来自其中一个教程的示例代码,我似乎无法工作,这里出了什么问题?

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程序中嵌入一个使用OpenOPC的小python脚本,并且希望在这两者之间传输数据。但是,我已经通过基本例子在概念验证测试中失败了。

+2

你知道你必须缩进一个python的while的身体吗? – Griwes

+1

为Python编写扩展而不是嵌入Python几乎总是更好,更强大。这样做看起来很相似,但有更好的扩展工具,并且在需要时更容易访问其他Python工具。查看http://twistedmatrix.com/users/glyph/rant/extendit.html了解扩展与嵌入的透视。 –

+0

是的,关于缺少的缩进,在发布过程中丢失了,它在IDE中。 – Shorkaa

回答

14

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

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

将当前目录添加到模块搜索路径并使您的示例工作。

+0

'PySys_SetPath(“。”)'清除/覆盖搜索路径。你最好[追加](http://stackoverflow.com/a/8859538/6394138)。 – Leon

2

您正在进行检查而没有检查错误,所以它不会让您的代码以这种方式失败。从您的描述中,听起来像mymodNULL,这将与导入失败一致。导入失败的一个可能原因是您发布的reverse.py有语法错误。