2010-02-09 85 views
0

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

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); 
} 
+1

我张贴这是一个评论,而不是一个答案,但我已经普遍认为,将C部分编译为共享库并使用ctypes比使用扩展库更易于管理。 – 2010-02-09 18:09:15

+0

谢谢 - 我会研究这一点,尤其是因为我比Python更熟悉Python。 – jeffaudio 2010-02-09 18:15:12

+0

Cython是一个为C库提供Python绑定的更加平滑的选项。 – 2010-02-09 18:18:54

回答

1

PyModule_AddObject()窃取的参考。因此,你不应该在之后递减列表。

+0

我已经更新了您的建议(这实际上是我最初的样子)的代码,但它仍然是随机崩溃。 – jeffaudio 2010-02-09 18:11:41

1

PyList_New()可以返回NULL来指示您未检查的错误。 Py_BuildValue()可以返回NULL以指示您未检查的错误。 PyList_Append()可能会返回-1以指示您还没有检查的错误。 PyList_Append()不会窃取参考,因此您泄露了由Py_BuildValue()返回的字典的参考。后者可能会导致内存不足,这可能会导致Py_BuildValue()PyList_Append()失败,并且处理该错误的失败可能会导致崩溃。

(别的东西也能引起Py_BuildValue()PyList_Append()失败,但很难从刚才这个片段猜。)

+0

感谢有关内存管理的信息。有趣的是,当我手动调用命令来获得响应时,它从来没有失败,但是当我从for循环中运行它并非常快地命中它时,它就会崩溃。这使我相信系统中可能会有其他问题导致崩溃。我会更深入地探讨这个问题。 – jeffaudio 2010-02-09 21:59:44