将Python嵌入C - 导入模块
我在使用嵌入式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");
来把当前目录加入到模块的搜索路径里,这样你的例子就能正常工作了。