使 cython 枚举可见

hfh*_*hc2 5 enums cython

这个问题本质上是关于这个问题的后续。具体来说,我想知道共享模块之间的枚举可见性。本质上,我想将包装的 C 枚举作为 python API 的一部分(使用 cython)。包装一些现有 C 代码的最简单方法是简单 lib.pyx(为了简单起见,我逐字包含了标头)

cdef extern from *:
"""
typedef enum Status {GOOD, BAD} Status;
"""
cpdef enum Status:
    GOOD,
    BAD
Run Code Online (Sandbox Code Playgroud)

如果我将此文件编译成共享库(例如lib.so),我可以直接使用枚举,即我可以键入python3 -c "import lib; print(lib.Status)"并查看<enum 'Status'>,这确实是预期的行为。

现在假设我想将代码拆分为一个标头(又名lib.pxd),其中包含上面的代码以及一个包含该标头的实现文件(又名lib.pyx) :cimport

from lib cimport Status

def test():
    print Status.GOOD
Run Code Online (Sandbox Code Playgroud)

我可以再次编译该项目,但是结果却截然不同。我可以访问该函数test,但python3 -c "import lib; lib.test()"只是返回0,而不是<Status.GOOD: 0>.

更重要的是,python3 -c "import lib; print(lib.Status)"现在给我

Traceback (most recent call last):
  File "<string>", line 1, in <module>
AttributeError: module 'lib' has no attribute 'Status'
Run Code Online (Sandbox Code Playgroud)

简而言之: pxd 文件中声明的枚举不包含在最终模块中,即使它被声明为cpdef.

这种行为是故意的吗?有什么方法可以将声明包含到生成的模块中吗?