我有一个共享库,其中包含以下功能:

char * LibVers()
{
    return " LibVers 2.03";
}

我正在使用ctypes包装said共享库,并定义了如下属性:
@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机器(Fedora16)上,此代码工作正常。但是,在64b机器(CentOS 7)上,此代码分段错误(核心转储)。
为什么会这样?

最佳答案

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()

关于python - python ctype字符串指针32b vs 64b:段错误(核心已转储),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25784454/

10-09 08:46