Python CFFI перечисление от имени строки - PullRequest
0 голосов
/ 10 февраля 2019

У меня есть перечисление, определенное в Python cffi.Как мне создать его по имени? В документах говорится, как получить имя строки из 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 голосов
/ 11 февраля 2019

Вам нужно позвонить 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).

...