作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我想做the integer constants (ACTIVE_TAG, etc) defined here :
//island management, m_activationState1
#define ACTIVE_TAG 1
#define ISLAND_SLEEPING 2
#define WANTS_DEACTIVATION 3
#define DISABLE_DEACTIVATION 4
#define DISABLE_SIMULATION 5
可用作我正在处理的 Cython 定义模块的普通属性,以便 Python 应用程序代码可以访问它们(将它们传递给根据它们定义的包装 API)。
我已经研究过用 cdef 将它们定义为整数或枚举,但这些方法都没有真正将值绑定(bind)到 Cython 模块中的属性。还有哪些其他选择?
最佳答案
这是一种方法,虽然看起来很乏味,但可以将任何给定的 .h 文件作为输入自动化:
步骤 1. 将您想要的所有常量放入一个文件中,例如 bulletdefs.h
,该文件具有 #defines
但带有前导下划线,例如:
#define _ACTIVE_TAG 1
#define _ISLAND_SLEEPING 2
#define _WANTS_DEACTIVATION 3
#define _DISABLE_DEACTIVATION 4
#define _DISABLE_SIMULATION 5
第 2 步。在模块的 pyx 文件中插入一个部分,例如 bullet.pyx
:
cdef extern from "bulletdefs.h":
cdef int _ACTIVE_TAG
cdef int _ISLAND_SLEEPING
cdef int _WANTS_DEACTIVATION
cdef int _DISABLE_DEACTIVATION
cdef int _DISABLE_SIMULATION
ACTIVE_TAG = _ACTIVE_TAG
ISLAND_SLEEPING = _ISLAND_SLEEPING
WANTS_DEACTIVATION = _WANTS_DEACTIVATION
DISABLE_DEACTIVATION = _DISABLE_DEACTIVATION
DISABLE_SIMULATION = _DISABLE_SIMULATION
然后,当你编译你的模块时,你应该得到预期的效果:
Python 2.7.1+ (r271:86832, Apr 11 2011, 18:05:24)
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import bullet
>>> bullet.ACTIVE_TAG
1
>>> bullet.DISABLE_SIMULATION
5
>>>
关于python - 如何在 Cython 模块中将 #defined C 值暴露给 Python?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5697479/
我是一名优秀的程序员,十分优秀!