gpt4 book ai didi

python - 帮助我理解为什么我对 Python 的 ctypes 模块的简单使用失败了

转载 作者:太空狗 更新时间:2023-10-30 00:52:18 27 4
gpt4 key购买 nike

我正在尝试理解 Python“ctypes”模块。我整理了一个简单的示例——理想情况下——包装了 statvfs() 函数调用。代码如下所示:

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 文档?还是这里发生了其他事情?

谢谢!

最佳答案

执行此命令以获取 struct statvfs 的确切定义在您的系统上:

echo '#include <sys/statvfs.h>' | gcc -E - | less

然后按/struct statvfs<enter>跳到定义并从那里浏览。

另请查看 my patch到 fusepy,和 their definition .

关于python - 帮助我理解为什么我对 Python 的 ctypes 模块的简单使用失败了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3449442/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com