Вам нужно позвонить 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'
call dlopen ():
>>> c = ffibuilder.dlopen('c')
Теперь откройте / присвойте значения перечисления:
>>> c.dense
0
>>> c.sparse
1
>>>
Из ffi docs :
Вы можете использовать объект библиотеки для вызова функций, ранее объявленных ffi.cdef (), для чтения константи для чтения или записи глобальных переменных.Обратите внимание, что вы можете использовать одну функцию cdef () для объявления функций из нескольких библиотек, если вы загружаете каждую из них с помощью dlopen () и получаете доступ к функциям из правильной библиотеки.
libpath - это имя файлаобщей библиотеки, которая может содержать полный путь или нет (в этом случае она ищется в стандартных местах, как описано в man dlopen), с расширениями или нет.Кроме того, если libpath имеет значение None, он возвращает стандартную библиотеку C (которая может использоваться для доступа к функциям glibc в Linux).