2011-11-24 245 views
0

我需要將PyInt轉換爲C int。在我的代碼中將PyInt轉換爲C Int

count=PyInt_FromSsize_t(PyList_Size(pValue)) 

pValue是PyObject,PyList。我遇到的問題是PyList_Size沒有給我返回正確的列表大小(count應該是5,但它給了我600萬),或者因爲在與python腳本連接的C代碼中存在數據類型的問題。理想情況下,我希望計數爲C int類型。

我發現python/c API返回長C數據類型......這不是我想要的...任何人都可以指向正確的方法或API?

+1

爲什麼是'long'不好嗎? – delnan

回答

3

PyInt_FromSsize_t()返回一個完整的Python int坐在內存中的對象,並返回其內存地址 - 這是600萬數字來自的地方。你只是想通過PyList_Size()返回的標量,並將其轉換爲一個C整數,我想:

count = (int) PyList_Size(pValue) 

如果該列表可能會很長,你可能要考慮讓count一個long相反,在這種情況下,您可以轉而使用該特定類型。

注意:計數爲-1意味着Python在嘗試測量列表長度時遇到異常。下面是你應該看了就知道如何處理異常文檔:

http://docs.python.org/c-api/intro.html#exceptions

+0

我試過你的建議,計數是-1。但如果我嘗試(int)PyInt_FromSsize_t(PyList_Size(pValue))它也給了我很大的數量。那麼是PyList_Size搞砸了嗎? – PeterG

+0

「-1」的數量意味着您嘗試測量您認爲是一個列表的長度已經因致命的Python異常而失敗。大多數Python API調用可能會失敗並返回整數「-1」或指針值「0」(NULL)來表示它們失敗。您應該始終檢查您爲此類值所做的每個調用,並將故障返回到Python,以便它可以打印該異常並向用戶回溯。 –