2011-04-18 14 views
19

me gustaría hacer the integer constants (ACTIVE_TAG, etc) defined here:¿Cómo se puede exponer un valor C#definido a Python en un módulo Cython?

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

disponibles como atributos normales de un módulo Cython definido que estoy trabajando, por lo que el código de aplicación Python puede acceder a ellos (para pasarlos a las API que están envueltos definido en términos de ellos).

He examinado la definición de estos con cdef como enteros o enumeraciones, pero ninguno de estos enfoques realmente vincula el valor a un atributo en el módulo Cython. ¿Qué otras opciones hay?

Respuesta

20

Ésta es una forma, que, aunque en principio parece tedioso, factible podría ser automatizado para cualquier archivo .h dada como entrada:

Paso 1. Obtener todas las constantes que desea en un archivo, por ejemplo bulletdefs.h, que tiene la #defines pero con subrayado iniciales, por ejemplo:

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

Paso 2. Inserte una sección en el archivo pyx para su módulo, bullet.pyx decir:

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 

Luego, cuando compile su módulo, debe obtener el efecto deseado:

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 
>>> 
+15

Thanks. Esto funciona, e incluso hay un atajo más que se puede tomar (que es donde me quedé atrapado antes). Puedo usar las definiciones directamente desde bullet y cambiarles el nombre en el espacio de nombres de Cython haciendo cosas como 'cdef int _ACTIVE_TAG" ACTIVE_TAG "'. El nombre entre comillas es lo que Cython busca en el lado C de las cosas, el nombre a la izquierda de eso es cómo su valor está expuesto a Python. –

+1

Eso está bien, ¡gracias por señalar ese atajo! –

+0

@ Jean-PaulCalderone Supongo que quería decir 'cdef int ACTIVE_TAG" _ACTIVE_TAG "'. –

Cuestiones relacionadas