【问题标题】:Accessing cffi enums访问 cffi 枚举
【发布时间】:2015-01-29 04:03:22
【问题描述】:

假设我在 cffi 下定义了一个枚举:

from cffi import FFI
ffi = FFI()
ffi.cdef('typedef enum {RANDOM, IMMEDIATE, SEARCH} strategy;')

现在再次调用cdef 时可以轻松访问它。但是我如何在不重新声明的情况下在 python 中访问这个枚举呢?在文档中找不到任何提及。

【问题讨论】:

    标签: python python-cffi


    【解决方案1】:

    按照@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'],但是这对#defines不起作用,所以上面的方式更好。

    【讨论】:

      【解决方案2】:

      如果你已经包装了一个库,你可以使用上面相同的方法:

      import _wrappedlib
      
      print _wrappedlib.lib.RANDOM
      

      【讨论】:

        【解决方案3】:

        使用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
        

        【讨论】:

          猜你喜欢
          • 2011-07-09
          • 1970-01-01
          • 2018-01-09
          • 2020-07-04
          • 1970-01-01
          • 2019-03-30
          • 2019-07-04
          • 1970-01-01
          • 2021-05-21
          相关资源
          最近更新 更多