我是 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/