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

Python 如何在64位环境中处理ctypes中的字符串数组(char**)?,python,arrays,string,64-bit,ctypes,Python,Arrays,String,64 Bit,Ctypes,我使用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都来自存储库,所以我假设问题出在我的代码中;我需要用更一般

我使用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位整数。在32位进程中,这些整数和指针大部分是可互换的——而对于64位构建则不然

正在做

gp.gp_library_version.restype = ctypes.c_void_p
在这种情况下,在您的电话足够之前,您仍然需要 x=ctypes.c\u char\u p.from\u addressa行


请查看API文档,了解您是否应该在使用该指针后自行释放该指针。在这种情况下,可能是这样。

如果您没有在ctypes中对函数进行任何注释,则假定它们返回32位整数。在32位进程中,这些整数和指针大部分是可互换的——而对于64位构建则不然

正在做

gp.gp_library_version.restype = ctypes.c_void_p
在这种情况下,在您的电话足够之前,您仍然需要 x=ctypes.c\u char\u p.from\u addressa行


检查API文档,确定您是否应该在使用该指针后自行释放该指针。在这种情况下,可能是这样。

问题在于,默认情况下,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假设所有函数都返回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
在我的Fedora 14系统python-2.7-8.fc14.1.x86_64上打印[0]就足够了。在我的Fedora 14系统python-2.7-8.fc14.1.x86_64上打印[0]就足够了。