我想了解Python「ctypes」模塊。我已經將一個簡單的例子放在一起 - 理想情況下 - 包裝statvfs()函數調用。代碼如下所示:幫我理解爲什麼我使用Python的ctypes模塊失敗
from ctypes import *
class struct_statvfs (Structure):
_fields_ = [
('f_bsize', c_ulong),
('f_frsize', c_ulong),
('f_blocks', c_ulong),
('f_bfree', c_ulong),
('f_bavail', c_ulong),
('f_files', c_ulong),
('f_ffree', c_ulong),
('f_favail', c_ulong),
('f_fsid', c_ulong),
('f_flag', c_ulong),
('f_namemax', c_ulong),
]
libc = CDLL('libc.so.6')
libc.statvfs.argtypes = [c_char_p, POINTER(struct_statvfs)]
s = struct_statvfs()
res = libc.statvfs('/etc', byref(s))
print 'return = %d, f_bsize = %d, f_blocks = %d, f_bfree = %d' % (
res, s.f_bsize, s.f_blocks, s.f_bfree)
運行此不約而同返回:
return = 0, f_bsize = 4096, f_blocks = 10079070, f_bfree = 5048834
*** glibc detected *** python: free(): invalid next size (fast): 0x0000000001e51780 ***
*** glibc detected *** python: malloc(): memory corruption (fast): 0x0000000001e517e0 ***
我一直沒能找到調用複雜類型作爲參數的任何例子(有很多返回複雜類型的函數示例),但在盯着ctypes文檔一天左右之後,我認爲我的調用語法是正確的......它實際上是調用statvfs()調用並獲取正確的結果。
我誤解了ctypes文檔嗎?還是有其他事情在這裏?
謝謝!
我還沒有找到答案,但我可以告訴你,當我將它作爲腳本運行時,你的代碼對我來說工作正常,但是當我在交互式解釋器中運行它時會導致段錯誤。具體來說,它會在一些看似隨機的時間段後,或者解釋器退出時,以先到者爲準,導致段錯誤。我會一直試圖弄清楚這一點,但我認爲這些信息可能會讓問題更容易找到比我更有見識的人。 – 2010-08-10 13:49:16
一個問題可能是您不必定義類struct_statvfs,例如,你的尺寸比libc認爲的要小。運行這個小C程序來驗證:#include int main(){return!printf(「%d \ n」,sizeof(struct statvfs)); } –
pts
2010-08-10 13:52:47
錯誤和過時的文檔比沒有文檔更糟糕。我沒有想到看到一個困擾我的結構定義(與statvfs無關)。好事我看到了這個問題。 – ianalis 2010-08-20 16:26:40