2016-05-20 9 views
6

Ich bin ziemlich neu in Cython, aber ich versuche, mehr zu lernen, wie ich in der Lage sein würde, eine ziemlich große und komplizierte Reihe von nennen C/C++ - Code direkt aus Python.Neu bei Cython ... kann nicht scheinen enum richtig zu wrap

Ich konnte die Beispiele OK durchlaufen und konnte sogar einen kleinen Teil des Hauptprojekts, an dem ich arbeite, einpacken. Aber ich habe mich daran gehängt, Enums zu verpacken.

Ich habe versucht, in einem sehr vereinfachten Beispiel auszubrechen, was ich versuche. Hier

ist der C-Code, in myenum.h

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

Hier ist, was ich dachte funktionieren würde als wapper in pymyenum.pyx

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

Und hier ist mein 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 diesem Verzeichnis betreibe ich

python setup.py build_ext --inplace 

und ich bekomme mein pymyenum.so, dass ich importieren kann! Ja! Aber ich kann nicht auf die Strategie zugreifen.

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 

Ich kann nicht scheinen, das richtige Beispiel zu finden, um mich aus diesem zu befreien. Vielen Dank im Voraus für alle, die helfen können!

Matt

Antwort

6

Es wird funktionieren, wie Sie wollen, wenn Sie diese pymyenum.pyx verwenden:

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

Beachten Sie, dass Ihr Kopf ac Header ohne 'MyEnum' Namespace ist, und es ist cpdef für alles, was Sie möchte nach Python exportiert werden. cdef macht nur Dinge in Cython-Code verfügbar.

+0

Das hat funktioniert! Vielen Dank! –

+0

Und danke, dass du dir die Zeit genommen hast, mir den Unterschied zwischen "cdef" und "cpdef" zu erklären. Sehr dankbar für die Ausbildung. –

+2

@MattBellis, wenn dies Ihre Frage beantwortet, achten Sie darauf, es als die akzeptierte Antwort zu markieren, indem Sie auf das Häkchen :-) –