python - Cython 的新手......似乎无法正确包装枚举

标签 python c++ c enums cython

我是 Cython 的新手,但我想了解更多,因为我希望能够直接从 Python 调用相当大且复杂的 C/C++ 代码集。

我已经能够很好地运行这些示例,甚至能够包装我正在处理的主要项目的一小部分。但是我一直坚持包装枚举。

我试图在一个非常简化的示例中阐明我正在尝试的内容。

这是myenum.h中的C代码

// myenum.h
enum strategy {
    slow = 0,
    medium = 1,
    fast = 2
};

这是我认为可以在 pymyenum.pyx 中用作 wapper 的东西

# distutils: language = c
cdef extern from "myenum.h" namespace "myenum":
    cdef enum strategy:
        slow,
        medium,
        fast

这是我的 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
    ))

在这个目录下,我运行

python setup.py build_ext --inplace

我得到了我的 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

我似乎找不到合适的例子来让我摆脱困境。提前感谢任何可以提供帮助的人!

马特

最佳答案

如果你使用这个 pymyenum.pyx,它将按照你想要的方式工作:

# distutils: language = c
cdef extern from "myenum.h":
    cpdef enum strategy:
        slow,
        medium,
        fast

请注意,您的 header 是一个没有 'myenum' 命名空间的 c header ,它是 cpdef 用于您想要导出到 python 的任何内容。 cdef 只是让 cython 代码可用。

关于python - Cython 的新手......似乎无法正确包装枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37350303/

相关文章:

c++ - 命令行测试程序 -> 只生产第一部分

c++ - 通过减少 if 语句使代码更高效

c++ - 访问成员变量时加上const

c - Msvc及其输出控制台

python - 如何导出以包含所有依赖项的方式开发的 python 包,以便在另一台机器上进行离线安装?

python - 将整个 *ui 文件加载到另一个 *.ui 文件的框架/小部件中

c++ - 如何取消引用函数指针并在 MSVC++ 下读取为数据?

c - 段错误 - C 错误中的字符串连接

python - GDB pretty-print : returning string from a children()'s iterator, 但显示为 char[]

python - Bokeh:如何单击并拖动以显示点之间的位移