2010-02-09 80 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