【问题标题】:Python CFFI enum from string name来自字符串名称的 Python CFFI 枚举
【发布时间】:2019-07-04 08:58:53
【问题描述】:

我在 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'

【问题讨论】:

    标签: python enums python-cffi


    【解决方案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的功能)。

    【讨论】:

    • 您可以使用FFI 对象对cdefs 进行如此多的操作,但不是这个,这似乎很奇怪。
    猜你喜欢
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-10
    相关资源
    最近更新 更多