Cython的新功能...似乎无法正确包装枚举

Mat*_*lis 6 c c++ python enums cython

我是Cython的新手,但我正在努力学习更多内容,因为我希望能够直接从Python调用一组相当大而复杂的C/C++代码.

我已经能够完成这些示例,甚至可以包装我正在工作的主要项目的一小部分.但我已经坚持包装枚举.

我试图在一个非常简单的例子中突破我正在尝试的东西.

这是myenum.h中的C代码

// myenum.h
enum strategy {
    slow = 0,
    medium = 1,
    fast = 2
};
Run Code Online (Sandbox Code Playgroud)

以下是我认为在pymyenum.pyx中作为wapper工作的内容

# distutils: language = c
cdef extern from "myenum.h" namespace "myenum":
    cdef enum strategy:
        slow,
        medium,
        fast
Run Code Online (Sandbox Code Playgroud)

这是我的setup.py

from distutils.core import setup
from Cython.Build import cythonize

setup(ext_modules = cythonize(
    "pymyenum.pyx",                 # our Cython source
    sources=["myenum.h"],  # additional source file(s)
    language="c",             # generate C code
    ))
Run Code Online (Sandbox Code Playgroud)

在这个目录中,我运行

python setup.py build_ext --inplace
Run Code Online (Sandbox Code Playgroud)

我得到了我的pymyenum.so,我可以导入!是啊!但我无法访问策略.

In [1]: import pymyenum

In [2]: pymyenum.
pymyenum.c    pymyenum.pyx  pymyenum.so

In [2]: pymyenum.strategy
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-2-80980071607b> in <module>()
----> 1 pymyenum.strategy

AttributeError: 'module' object has no attribute 'strategy'

In [3]: from pymyenum import strategy
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-3-9bae6637f005> in <module>()
----> 1 from pymyenum import strategy

ImportError: cannot import name strategy
Run Code Online (Sandbox Code Playgroud)

我似乎无法找到让我脱离这一点的正确例子.提前感谢任何可以提供帮助的人!

马特

pat*_*tew 6

如果您使用此pymyenum.pyx,它将按您的要求工作:

# distutils: language = c
cdef extern from "myenum.h":
    cpdef enum strategy:
        slow,
        medium,
        fast
Run Code Online (Sandbox Code Playgroud)

请注意,您的标头是没有'myenum'命名空间的ac标头,它cpdef适用于您想要导出到python的任何内容.cdef只是让cython代码中的东西可用.

  • @MattBellis如果这回答了你的问题,请务必通过点击勾选标记为接受的答案:-) (2认同)