访问 cffi 枚举
Posted
技术标签:
【中文标题】访问 cffi 枚举【英文标题】:Accessing cffi enums 【发布时间】:2015-01-29 04:03:22 【问题描述】:假设我在 cffi 下定义了一个枚举:
from cffi import FFI
ffi = FFI()
ffi.cdef('typedef enum RANDOM, IMMEDIATE, SEARCH strategy;')
现在再次调用cdef
时可以轻松访问它。但是我如何在不重新声明的情况下在 python 中访问这个枚举呢?在文档中找不到任何提及。
【问题讨论】:
【参考方案1】:按照@falsetru 的回答,ffi.dlopen('c')
不再适用于 Windows 7 和 Python 3.7,但我今天发现我们可以使用任何库而不是 'c'
,它仍然有效。在https://bugs.python.org/issue23606 推荐的是使用ucrtbase.dll
,所以我们可以这样做:
>>> ffi.cdef('#define MAX_PATH 260')
>>> ffi.dlopen('kernel32.dll').MAX_PATH
260
另外一个比较复杂的枚举方式是使用self.typeof('strategy').relements['RANDOM']
,但是这对#define
s不起作用,所以上面的方式更好。
【讨论】:
【参考方案2】:如果你已经包装了一个库,你可以使用上面相同的方法:
import _wrappedlib
print _wrappedlib.lib.RANDOM
【讨论】:
【参考方案3】:使用ffi.dlopen
,并通过使用ffi.dlopen
的返回值限定来访问枚举值:
>>> from cffi import FFI
>>> ffi = FFI()
>>> ffi.cdef('typedef enum RANDOM, IMMEDIATE, SEARCH strategy;')
>>> c = ffi.dlopen('c')
>>> c.RANDOM
0
>>> c.IMMEDIATE
1
>>> c.SEARCH
2
【讨论】:
以上是关于访问 cffi 枚举的主要内容,如果未能解决你的问题,请参考以下文章