【问题标题】:Embedding Python into C - importing modules将 Python 嵌入到 C 中 - 导入模块
【发布时间】:2011-09-02 13:14:38
【问题描述】:

根据Documentation,我在使用适用于 C 的嵌入式 Python 时遇到问题 - 每当我尝试使用导入的模块时,我都会得到:

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

我正在使用 MSVS2008、Python 2.7 运行 XP 机器

一点上下文:我正在尝试在一个相当大的 C 程序中嵌入一个使用 OpenOPC 的小型 python 脚本,并希望在两者之间传输数据。但是,我已经在基本示例的概念验证测试中失败了。

【问题讨论】:

  • 你知道你必须缩进 python 的 while 体吗?
  • 为 Python 编写扩展而不是嵌入 Python 几乎总是更好、更强大。这样做看起来非常相似,但是有更好的扩展工具,并且在需要时更容易访问其他 Python 工具。查看twistedmatrix.com/users/glyph/rant/extendit.html,了解扩展与嵌入的观点。
  • 是的,关于丢失的缩进,在发布过程中刚刚丢失,它在 IDE 中。

标签: python c python-c-api python-embedding


【解决方案1】:

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

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

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

【讨论】:

  • PySys_SetPath(".") 清除/覆盖搜索路径。你最好append给它。
【解决方案2】:

您在没有检查错误的情况下继续进行,因此您的代码以这种方式失败也就不足为奇了。根据您的描述,听起来mymod 是NULL,这与导入失败一致。导入失败的一个可能原因是您发布的reverse.py 有语法错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-12
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多