字符串名称中的Python CFFI枚举

时间:2019-02-10 20:40:52

标签: python enums python-cffi

我有一个用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'

1 个答案:

答案 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的功能)。