获取对结构成员的引用
Get reference to struct member
我有以下结构:
import ctypes as c
class sigaction_t(c.Structure):
_fields_ = [
("sa_handler", c.c_void_p),
("sa_sigaction", c.c_void_p),
("sa_mask", c.c_int),
("sa_flags", c.c_int),
("sa_restorer", c.c_void_p),
]
如何获取此结构成员的引用?下面似乎不适用于 sa_mask
...
lib = c.cdll.LoadLibrary("libc.so.6")
sa = sigaction_t()
lib.sigemptyset(c.byref(sa.sa_mask)) #not working
TypeError: byref() argument must be a ctypes instance, not 'int'
我想我们可以说 sigemptyset
期望 c.POINTER(c.c_int)
。
sa.sa_mask
,访问时,return是 Python int
而不是 ctypes.c_int
,因此不能作为参考。有多种方法可以解决这个问题
- 禁止将
c_int
return 值自动转换为 Python int
。派生 类 将 return 一个 c_int
对象及其 .value
可以请求检索 Python int
:
import ctypes as c
class raw_c_int(c.c_int): pass # Derived classes suppress the conversion
class sigaction_t(c.Structure):
_fields_ = (("sa_handler", c.c_void_p),
("sa_sigaction", c.c_void_p),
("sa_mask", raw_c_int), # use derived class
("sa_flags", c.c_int),
("sa_restorer", c.c_void_p))
sa = sigaction_t()
lib.sigemptyset(c.byref(sa.sa_mask))
print(sa.sa_mask.value)
- 引入一个临时变量:
sa = sigaction_t()
mask = c.c_int()
lib.sigemptyset(c.byref(mask)))
sa.sa_mask = mask
- 使用
byref
的可选第二个参数计算成员的偏移量。根据您的 sigemptyset.argtypes
定义,这可能需要强制转换,因为不幸的是 returned 引用仍然具有类型 POINTER(sigaction_t)
:
sa = sigaction_t()
lib.sigemptyset(c.byref(sa, sigaction_t.sa_mask.offset))
# or
sa = sigaction_t()
lib.sigemptyset(c.cast(c.byref(sa, sigaction_t.sa_mask.offset), c.POINTER(c.c_int)))
print(sa.sa_mask.value)
我有以下结构:
import ctypes as c
class sigaction_t(c.Structure):
_fields_ = [
("sa_handler", c.c_void_p),
("sa_sigaction", c.c_void_p),
("sa_mask", c.c_int),
("sa_flags", c.c_int),
("sa_restorer", c.c_void_p),
]
如何获取此结构成员的引用?下面似乎不适用于 sa_mask
...
lib = c.cdll.LoadLibrary("libc.so.6")
sa = sigaction_t()
lib.sigemptyset(c.byref(sa.sa_mask)) #not working
TypeError: byref() argument must be a ctypes instance, not 'int'
我想我们可以说 sigemptyset
期望 c.POINTER(c.c_int)
。
sa.sa_mask
,访问时,return是 Python int
而不是 ctypes.c_int
,因此不能作为参考。有多种方法可以解决这个问题
- 禁止将
c_int
return 值自动转换为 Pythonint
。派生 类 将 return 一个c_int
对象及其.value
可以请求检索 Pythonint
:
import ctypes as c
class raw_c_int(c.c_int): pass # Derived classes suppress the conversion
class sigaction_t(c.Structure):
_fields_ = (("sa_handler", c.c_void_p),
("sa_sigaction", c.c_void_p),
("sa_mask", raw_c_int), # use derived class
("sa_flags", c.c_int),
("sa_restorer", c.c_void_p))
sa = sigaction_t()
lib.sigemptyset(c.byref(sa.sa_mask))
print(sa.sa_mask.value)
- 引入一个临时变量:
sa = sigaction_t()
mask = c.c_int()
lib.sigemptyset(c.byref(mask)))
sa.sa_mask = mask
- 使用
byref
的可选第二个参数计算成员的偏移量。根据您的sigemptyset.argtypes
定义,这可能需要强制转换,因为不幸的是 returned 引用仍然具有类型POINTER(sigaction_t)
:
sa = sigaction_t()
lib.sigemptyset(c.byref(sa, sigaction_t.sa_mask.offset))
# or
sa = sigaction_t()
lib.sigemptyset(c.cast(c.byref(sa, sigaction_t.sa_mask.offset), c.POINTER(c.c_int)))
print(sa.sa_mask.value)