我正在使用ctypes在Python中使用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_*功能可以正常工作。

最佳答案

问题是,默认情况下,ctypes假定所有函数都返回32位的int。但是,在64位系统上,指针是64位,因此您要删除指针返回值的高32位,因此,当尝试取消引用无效指针时,就会遇到段错误。

您可以通过将类型分配给其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

关于python - 如何在64位环境中处理ctypes中的字符串数组(char **)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5095944/

10-11 22:07
查看更多