这个问题本质上是关于这个问题的后续。具体来说,我想知道共享模块之间的枚举可见性。本质上,我想将包装的 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.
这种行为是故意的吗?有什么方法可以将声明包含到生成的模块中吗?
| 归档时间: |
|
| 查看次数: |
431 次 |
| 最近记录: |