我在Python语言中使用ctype来处理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.valuelibphoto2、ctype和python都来自存储库,所以我假设问题出在我的代码中;我需要以一种更通用的方式来考虑指针。gp_library_version()返回const char **,这是一个字符串常数数组。其他gp_*函数工作正常。
发布于 2011-02-24 03:38:44
问题是,在默认情况下,ctype假设所有函数都返回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发布于 2011-02-24 03:36:39
如果您没有对ctype中的函数进行任何注释,则假定它们返回32位整数。在32位进程中,这些整数和指针大多是可互换的-对于64位构建则不是这样。
只是在做
gp.gp_library_version.restype = ctypes.c_void_p在这种情况下,您的调用应该足够了(您仍然需要x = ctypes.c_char_p.from_address(a)行)。
检查API文档,看看你是否应该在使用这个指针后自己释放它(在这种情况下可能是)。
https://stackoverflow.com/questions/5095944
复制相似问题