代码之家  ›  专栏  ›  技术社区  ›  drhagen

字符串名称中的python cffi枚举

  •  0
  • drhagen  · 技术社区  · 6 年前

    我在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 回复  |  直到 6 年前
        1
  •  1
  •   brokenfoot    6 年前

    你需要打电话 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'
    

    调用DLPEN():

    >>> c = ffibuilder.dlopen('c')
    

    现在,访问/分配枚举值:

    >>> c.dense
    0
    >>> c.sparse
    1
    >>>
    

    ffi docs :

    可以使用library对象以前调用函数 由ffi.cdef()声明,用于读取常量,以及读取或写入全局 变量。注意,可以使用单个cdef()来声明函数 从多个库中,只要加载每个库 dlopen()并从正确的函数访问函数。

    libpath是共享库的文件名,它可以包含 是否为完整路径(在这种情况下,在标准中搜索 位置,如man dlopen中所述),是否有扩展。 或者,如果libpath为none,则返回标准C库 (可用于访问Linux上的glibc函数)。