这个问题本质上是关于this question的跟进。具体来说,我想知道跨共享模块的枚举可见性。
本质上,我想将包装好的C枚举作为python API的一部分(使用cython)。包装一些现有C代码的最简单方法是
lib.pyx
(为简单起见,我逐字添加了标头)
cdef extern from *:
"""
typedef enum Status {GOOD, BAD} Status;
"""
cpdef enum Status:
GOOD,
BAD
如果我将此文件编译到共享库中(例如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
我可以再次编译该项目,但是结果却大不相同。
我可以访问函数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'
简而言之:pxd文件中声明的枚举不包含在最终模块中,即使它声明为cpdef
。
此行为是故意的吗?有什么办法可以将声明包含在生成的模块中?