2014-09-11 44 views
1

我有一個共享庫,除其他事項外,包含此功能:蟒蛇CTYPE字符串的指針32B VS 64B:分段錯誤(核心轉儲)

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

我包裝,所述使用ctypes的,有一個共享庫property defined defined:

@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)上,這種代碼分段錯誤(核心轉儲)。

爲什麼會這樣?

回答

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

您可以使用'.restype = c_char_p'並放置轉換。 – 2014-09-14 07:41:54

+0

@MarkTolonen:那更優雅。謝謝。 – Sardathrion 2014-09-15 07:18:56