假设我在 cffi 下定义了一个枚举:
from cffi import FFI
ffi = FFI()
ffi.cdef('typedef enum {RANDOM, IMMEDIATE, SEARCH} strategy;')
现在再次调用时可以轻松访问它cdef
。但是我如何在不重新声明的情况下在 python 中访问这个枚举呢?在文档中找不到任何提及。
假设我在 cffi 下定义了一个枚举:
from cffi import FFI
ffi = FFI()
ffi.cdef('typedef enum {RANDOM, IMMEDIATE, SEARCH} strategy;')
现在再次调用时可以轻松访问它cdef
。但是我如何在不重新声明的情况下在 python 中访问这个枚举呢?在文档中找不到任何提及。
使用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
如果您已经包装了一个库,您可以使用与以下相同的内容:
import _wrappedlib
print _wrappedlib.lib.RANDOM
按照@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']
,但这对 s 不起作用#define
,所以上面的方式更好。