我有一个共享库,其中包含此功能:
char * LibVers()
{
return " LibVers 2.03";
}
我使用ctypes包装所述共享库,并且定义了一个属性如下:
@property
def lib_vers(self):
"""Get shared library version information.
:return: The shared library version string.
:rtype: String
"""
return c_char_p(self.lib.LibVers()).value
在32b机器(Fedora 16)上,这段代码运行正常。但是,在64b机器(CentOS 7)上这个代码分段错误(核心转储)。
为什么会这样?
答案 0 :(得分:1)
ctypes模块假定返回类型是c_int。如果没有,您必须自己提供返回类型并进行一些转换。大多数情况下,在32位上,这可以很好,但在64,你丢失指针的一些部分,从而使它无效。我将代码更改为以下内容,现在可以按预期工作。
@property
def lib_vers(self):
"""Get shared library version information.
:return: The shared library version string.
:rtype: String
"""
if self.lib.LibVers.argtypes is None:
self.lib.LibVers.restype = c_char_p
self.lib.LibVers.argtypes = []
return self.lib.LibVers()