【问题标题】:Updating python variable from c从 c 更新 python 变量
【发布时间】:2010-02-09 18:04:13
【问题描述】:

我有一个间歇性错误导致我的 Python 模块崩溃,我假设这是因为在 c 代码中没有正确获取引用计数而发生内存错误。我有一些代码可以在随机时间从远程位置获得响应。根据收到的数据,它需要更新我应该可以在 Python 中访问的数据变量。实现这一目标的最佳方法是什么?以下代码大部分时间都在运行,并且在运行时可以正常工作,但如果不正常运行,则会导致 Python 崩溃(打开 Visual Studio 调试框)。谢谢。

if (event == kResponseEvent) {
    list = PyList_New(0);

    for (i = 0; i < event->count; i++) {
        PyList_Append(list, Py_BuildValue("{s:i, s:s}",
                                          "id", event->id,
                                          "name", event->name));
    }

    PyModule_AddObject(module, "names", list);
}

【问题讨论】:

  • 我将此作为评论而不是答案发布,但我普遍认为将 C 部分编译为共享库并使用 ctypes 比使用扩展库更易于管理。
  • 谢谢 - 我会研究这个,特别是因为我比 C 更精通 Python。
  • Cython 是为 C 库提供 Python 绑定的更巧妙的选择。

标签: python c


【解决方案1】:

PyModule_AddObject() 窃取一个参考。因此,您不应该在之后减少列表。

【讨论】:

  • 我已根据您的建议更新了代码(实际上我最初是这样更新的),但它仍然随机崩溃。
【解决方案2】:

PyList_New() 可以返回 NULL 以指示您没有检查的错误。 Py_BuildValue() 可以返回 NULL 以指示您没有检查的错误。 PyList_Append() 可以返回 -1 以指示错误,您也不会检查该错误。 PyList_Append() 不会窃取引用,因此您泄露了对 Py_BuildValue() 返回的字典的引用。后者可能会导致你的内存不足,从而导致Py_BuildValue()PyList_Append() 失败,而你未能处理错误可能会导致崩溃。

(其他东西也可能导致Py_BuildValue()PyList_Append() 失败,但仅凭这个sn-p 很难猜到。)

【讨论】:

  • 感谢有关内存管理的信息。有趣的是,当我手动调用命令以获得响应时,它从未失败,但是当我从 for 循环运行它以非常快速地命中它时,它崩溃了。这让我相信系统中可能有其他问题实际上导致了崩溃。我会更多地研究这个问题。
猜你喜欢
  • 2020-09-09
  • 2011-01-17
  • 1970-01-01
  • 2022-08-10
  • 1970-01-01
  • 2015-08-25
  • 1970-01-01
  • 1970-01-01
  • 2018-03-24
相关资源
最近更新 更多