我正在使用Python 3.4.2与cyth0.24和GCC 4.9.1的树莓派工作。
我想使用一个cpdef enum
,它创建了一个PEP 435风格的Python Enum(自Python 3.4起可用)。该特性在Cython 0.21中引入。
我使用以下源代码:
#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)
然而,几个编译错误说几次或多或少相同,如:
- 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)
在交互式shell中,我运行:
>>> from enum import Enum
>>> Enum
<enum 'Enum'>
显然,该模块似乎存在并工作。
我的问题是:这些错误的原因是什么?
可以用ctypedef
或cdef.
来声明枚举
尝试这样定义枚举:
cdef enum Test:
A, B, C, D
或
ctypedef enum Test:
A, B, C, D
我想你可能有分号在错误的地方在你的头?同样在头文件中你定义了test
,但是在python中你只引用Test
。根据它实际应该是什么,应该像下面这样工作。在运行Arch Linux的树莓派上测试。
hello.h
typedef enum test { A, B, C, D } test;
hello.pyx
行cpdef enum Test "test":
表示"在Python中使用Test
,在C中使用test
。参见解决命名冲突- C名称规范。
cdef extern from "hello.h":
cpdef enum Test "test":
A, B, C, D
def t1():
for t in Test: print(t.value)
setup . py
from distutils.core import setup
from Cython.Build import cythonize
setup(name="hello", ext_modules=cythonize("hello.pyx"))
结果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