如何在64位环境中处理ctypes中的字符串数组(char**)?

2024-06-26 03:31:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Python中使用ctypes来处理libgphoto2。以下代码在32位计算机上成功,但在64位计算机(Linux、Ubuntu)上由于分段错误而失败:

import ctypes

gp = ctypes.CDLL('libgphoto2.so')
a = gp.gp_library_version(0)
x = ctypes.c_char_p.from_address(a)
x.value

libphoto2、ctypes和python都来自存储库,所以我假设问题出在我的代码中;我需要以更一般的方式考虑指针或类似的东西。gp_library_version()返回const char **,一个字符串常量数组。其他gp_*函数工作正常。在


Tags: 代码importsoversionubuntulinux计算机错误
2条回答

问题是,默认情况下,ctypes假定所有函数都返回int,即32位。但是,在64位系统中,指针是64位的,所以您要从指针返回值中去掉高32位,这样当您试图取消对无效指针的引用时,就会出现一个segfault。在

通过为函数的restype属性分配类型,可以更改函数的预期返回类型,如下所示:

gp = ctypes.CDLL('libgphoto2.so')
gp.gp_library_version.restype = ctypes.POINTER(ctypes.c_char_p)
a = gp.gp_library_version(0)
print a[0].value

如果您不注释ctypes中的函数,则假定它们返回32位整数。在32位进程中,这些整数和指针大多是可互换的,而对于64位构建则不是这样。在

只是在做

gp.gp_library_version.restype = ctypes.c_void_p

在这种情况下,你的电话应该足够了(你仍然需要 x = ctypes.c_char_p.from_address(a)行)。在

检查API文档中是否应该在您使用该指针后自行释放它(在本例中可能是这样)。在

相关问题 更多 >