2016-05-20 15 views
6

Sono abbastanza nuovo per Cython ma sto cercando di saperne di più, dato che mi piacerebbe poter chiamare un set abbastanza grande e complicato di Codice C/C++ direttamente da Python.Nuovo per Cython ... non riesco a comprendere correttamente enum

Sono stato in grado di eseguire gli esempi OK e sono stato persino in grado di racchiudere una parte molto piccola del progetto principale su cui sto lavorando. Ma sono rimasto bloccato nel caricare enumerazioni.

Ho provato a rompere quello che sto cercando in un esempio molto semplificato.

Ecco il codice C, in myenum.h

// myenum.h 
enum strategy { 
    slow = 0, 
    medium = 1, 
    fast = 2 
}; 

Ecco quello che ho pensato che avrebbe funzionato come un Wapper in pymyenum.pyx

# distutils: language = c 
cdef extern from "myenum.h" namespace "myenum": 
    cdef enum strategy: 
     slow, 
     medium, 
     fast 

E qui è la mia setup.py

from distutils.core import setup 
from Cython.Build import cythonize 

setup(ext_modules = cythonize(
    "pymyenum.pyx",     # our Cython source 
    sources=["myenum.h"], # additional source file(s) 
    language="c",    # generate C code 
    )) 

In questa directory, corro

python setup.py build_ext --inplace 

e ottengo il mio pymyenum.so, che posso importare! Si! Ma non riesco ad accedere alla strategia.

In [1]: import pymyenum 

In [2]: pymyenum. 
pymyenum.c pymyenum.pyx pymyenum.so 

In [2]: pymyenum.strategy 
--------------------------------------------------------------------------- 
AttributeError       Traceback (most recent call last) 
<ipython-input-2-80980071607b> in <module>() 
----> 1 pymyenum.strategy 

AttributeError: 'module' object has no attribute 'strategy' 

In [3]: from pymyenum import strategy 
--------------------------------------------------------------------------- 
ImportError        Traceback (most recent call last) 
<ipython-input-3-9bae6637f005> in <module>() 
----> 1 from pymyenum import strategy 

ImportError: cannot import name strategy 

Non riesco a trovare l'esempio giusto per tirarmi fuori da questo. Grazie in anticipo per tutti coloro che possono aiutare!

Matt

risposta

6

Si lavorerà come si desidera se si utilizza questo pymyenum.pyx:

# distutils: language = c 
cdef extern from "myenum.h": 
    cpdef enum strategy: 
     slow, 
     medium, 
     fast 

Si noti che l'intestazione è un header c senza namespace 'MyEnum', ed è cpdef per qualsiasi cosa voglio esportato in python. cdef rende solo le cose disponibili in codice cython.

+0

Ha funzionato! Grazie! –

+0

E grazie per aver trovato il tempo di spiegarmi la differenza tra 'cdef' e' cpdef'. Molto riconoscente per l'educazione. –

+2

@MattBellis se questo risponde alla tua domanda assicurati di contrassegnarla come risposta accettata cliccando sul segno di spunta :-) –

Problemi correlati