Как значение #defined C может быть представлено Python в модуле Cython? - PullRequest
23 голосов
/ 18 апреля 2011

Я хотел бы сделать целочисленными константами (ACTIVE_TAG и т. Д.), Определенными здесь :

//island management, m_activationState1
#define ACTIVE_TAG 1
#define ISLAND_SLEEPING 2
#define WANTS_DEACTIVATION 3
#define DISABLE_DEACTIVATION 4
#define DISABLE_SIMULATION 5

доступно как обычные атрибуты определенного Cython-модуля, над которым я работаю, чтобы код приложения Python мог получить к ним доступ (чтобы передать их обернутым API, которые определены в их терминах).

Я рассмотрел определение их с помощью cdef как целых чисел или перечислений, но ни один из этих подходов фактически не связывает значение с атрибутом в модуле Cython. Какие еще варианты есть?

1 Ответ

23 голосов
/ 18 апреля 2011

Вот один из способов, который, казалось бы, утомителен, но может быть автоматизирован для любого заданного файла .h в качестве ввода:

Шаг 1. Получите все необходимые константы в файл, скажем bulletdefs.h, который имеет #defines, но с начальными подчеркиваниями, например:

#define _ACTIVE_TAG 1
#define _ISLAND_SLEEPING 2
#define _WANTS_DEACTIVATION 3
#define _DISABLE_DEACTIVATION 4
#define _DISABLE_SIMULATION 5

Шаг 2. Вставьте раздел в файл pyx для вашего модуля, скажем bullet.pyx:

cdef extern from "bulletdefs.h":
    cdef int _ACTIVE_TAG
    cdef int _ISLAND_SLEEPING
    cdef int _WANTS_DEACTIVATION
    cdef int _DISABLE_DEACTIVATION
    cdef int _DISABLE_SIMULATION

ACTIVE_TAG = _ACTIVE_TAG
ISLAND_SLEEPING = _ISLAND_SLEEPING
WANTS_DEACTIVATION = _WANTS_DEACTIVATION
DISABLE_DEACTIVATION = _DISABLE_DEACTIVATION
DISABLE_SIMULATION = _DISABLE_SIMULATION

Затем, когда вы компилируете свой модуль, вы должны получить ожидаемый эффект:

Python 2.7.1+ (r271:86832, Apr 11 2011, 18:05:24) 
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import bullet
>>> bullet.ACTIVE_TAG
1
>>> bullet.DISABLE_SIMULATION
5
>>>
...