我有一个用python cffi定义的枚举。如何通过名称实例化它? The docs say how to get the string name from enum,而不是如何创建它。
ffibuilder = FFI()
ffibuilder.cdef('typedef enum { dense, sparse } dimension_mode;')
dim = ffibuilder.new('dimension_mode', 'sparse')
# E TypeError: expected a pointer or array ctype, got 'dimension_mode'
答案 0 :(得分:1)
您需要调用dlopen('c')
来将枚举加载到C名称空间中。
>>> from cffi import FFI
>>> ffibuilder = FFI()
>>> ffibuilder.cdef('typedef enum { dense, sparse } dimension_mode;')
>>> dim = ffibuilder.new('dimension_mode', 'sparse')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/anaconda3/lib/python3.6/site-packages/cffi/api.py", line 258, in new
return self._backend.newp(cdecl, init)
TypeError: expected a pointer or array ctype, got 'dimension_mode'
致电dlopen():
>>> c = ffibuilder.dlopen('c')
现在,访问/分配枚举值:
>>> c.dense
0
>>> c.sparse
1
>>>
来自ffi docs:
您可以使用库对象来先前调用函数 由ffi.cdef()声明,读取常量以及读取或写入全局 变量。请注意,您可以使用单个cdef()声明函数 只要您使用 dlopen()并从正确的函数访问函数。
libpath是共享库的文件名,可以包含 是否完整路径(在这种情况下,以标准路径搜索 位置,如man dlopen中所述,是否带有扩展名。 或者,如果libpath为None,则返回标准C库 (可用于在Linux上访问glibc的功能)。