2011-03-12 78 views
2

我正在編寫一個圍繞getifaddrs()的Python包裝。該接口使用struct ifaddrs類型,其第一個字段是另一個指針struct ifaddrs如何爲定義的結構創建一個POINTER?

struct ifaddrs { 
    struct ifaddrs *ifa_next; /* Pointer to the next structure. */ 
    ... /* SNIP!!11 */ 
}; 

然而,在Python表示此:

class struct_ifaddrs(Structure): 

    _fields_ = [ 
     ('ifa_next', POINTER(struct_ifaddrs)),] 

給出此錯誤:直到類定義完成

[email protected]:~/src/pydlnadms$ ./getifaddrs.py 
Traceback (most recent call last): 
    File "./getifaddrs.py", line 58, in <module> 
    class struct_ifaddrs(Structure): 
    File "./getifaddrs.py", line 61, in struct_ifaddrs 
    ('ifa_next', POINTER(struct_ifaddrs)), 
NameError: name 'struct_ifaddrs' is not defined 

struct_ifaddrs將不被綁定到當前範圍。當然,作爲一個指針類型,顯然在聲明中不需要struct_ifaddrs的定義,就像在C中一樣,但是這個類型需要在以後的使用中被解除。我該如何繼續?

+0

是否可行的是稍微退一步實現包裝不太字面?我在想,讓你的包裝類看起來更像一個數組或者'ifaddrs'的列表,而沒有任何'next'的概念。 – sarnold 2011-03-12 09:10:21

回答

5

這個怎麼樣?

class struct_ifaddrs(Structure): 
    pass 
struct_ifaddrs._fields_ = [ 
    ('ifa_next', POINTER(struct_ifaddrs)),] 

正如保羅·麥圭爾在評論中指出,這是記錄在the ctypes documentationyet another time in the same docs這個問題的標準溶液。

+0

在ctypes文檔中描述了這個確切的問題,並將其作爲標準解決方案。 – PaulMcG 2011-03-12 09:24:07

+0

@Paul McGuire:這個鏈接可能贏得了解決方案。 – 2011-03-12 12:15:55

+0

@Sven Marnach:你可以在ctypes中添加一個鏈接來描述這個+1嗎? – 2011-03-12 12:16:36

相關問題