2016-06-27 9 views
0

Ich arbeite an einem Raspberry PI mit Python 3.4.2 mit Cython 0.24 und GCC 4.9.1.
Ich möchte eine cpdef enum verwenden, die eine PEP 435 Stil Python Enum (seit Python 3.4 verfügbar) erstellt. Dieses Merkmal wurde in Cython 0.21 eingeführt.Was ist der Grund für diesen Cython-Kompilierfehler beim Deklarieren eines cpdef-Enums?

Ich bin mit dem folgenden Quelltext:

#lib.h file 
typedef enum { A, B, C, D } test; 

#lib.pyx file 
cdef extern from "lib.h": 
    cpdef enum test: 
     A, B, C, D 

def t1(): 
    for t in test: print(t.value) 

jedoch sagen mehrere Kompilierungsfehler einige Zeit mehr oder weniger das gleiche wie:
- lib.c:4664:20: error: invalid application of 'sizeof' to incomplete type 'enum test'
- lib.c:2599:45: error: type of formal parameter 1 is incomplete __pyx_t_4 = __Pyx_PyInt_From_enum__test(C); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 56, __pyx_L1_error)

In einer interaktiven Shell Ich lief:

>>> from enum import Enum 
>>> Enum 
<enum 'Enum'> 

Offensichtlich scheint das Modul vorhanden zu sein und zu funktionieren.

Meine Frage ist: Was könnte die Ursache für diese Fehler sein?

Antwort

0

Ein ENUM kann entweder mit ctypedef oder cdef.
Versuchen Sie definieren Ihre Enum wie deklariert werden:

cdef enum Test: 
    A, B, C, D 

oder

ctypedef enum Test: 
    A, B, C, D 
+0

Oder 'CPDEF Enum Test'as ich in der Einleitung erwähnt. "Enums können jetzt als cpdef deklariert werden, um ihre Werte in den Python-Namespace des Moduls zu exportieren." [Cython Changelog] (https://github.com/cython/cython/blob/master/CHANGES.rst#021-2014-09-10). Vielleicht liest du meine Frage noch einmal ... –

+0

Wenn ich es wäre, würde ich es versuchen/alt, um sicher zu sein, dass das Problem liegt, wo ich denke, dass es liegt, und wenn ich sicher bin, was die Ursache ist Ich würde die Situation beheben. Aber das bin nur ich. – boardrider

+0

Keine Probleme auf die alte Art und Weise. –

0

ich glaube, Sie das Semikolon am falschen Ort haben könnte in Ihrem Header? Auch in der Kopfzeile definieren Sie test, aber im Cython beziehen Sie sich nur auf Test. Abhängig davon, was es eigentlich sein soll, sollte etwas wie unten funktionieren. Getestet auf einem Raspberry Pi mit Arch Linux.

hello.h

typedef enum test { A, B, C, D } test; 

hello.pyx

Die Linie cpdef enum Test "test": bedeutet „verwenden Test in Python und test in C. Resolving naming conflicts - C name specifications See.

cdef extern from "hello.h": 
    cpdef enum Test "test": 
     A, B, C, D 

def t1(): 
    for t in Test: print(t.value) 

s etup.py

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

setup(name="hello", ext_modules=cythonize("hello.pyx")) 

Ergebnis

Python 3.5.1 (default, Mar 6 2016, 12:32:57) 
[GCC 5.3.0] on linux 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import hello 
>>> hello.t1() 
0 
1 
2 
3 
+0

Ich konnte Ihr Beispiel erfolgreich ausführen. Leider waren die Fehler mit dem Namen des Namens einfach ein Tippfehler. Ich habe mich geirrt wegen der C-Deklaration der Enum. Ich habe meine Frage aktualisiert und vielleicht können Sie es sich noch einmal ansehen. Mit dem obigen Beispiel kann ich den gleichen Fehler wie oben erwähnt nicht reproduzieren. Der ursprüngliche Fehler tritt in einem größeren Projekt auf, das eine Headerdatei aus einer echten Bibliothek enthält. Vielleicht hängen die Fehler zusammen. –

Verwandte Themen