在声明cpdef enum时出现Cython编译错误的原因是什么?



我正在使用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'>

显然,该模块似乎存在并工作。

我的问题是:这些错误的原因是什么?

可以用ctypedefcdef.来声明枚举
尝试这样定义枚举:

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

相关内容

  • 没有找到相关文章

最新更新