gpt4 book ai didi

python - 如何在 Cython 模块中将 #defined C 值暴露给 Python?

转载 作者:IT老高 更新时间:2023-10-28 20:22:32 26 4
gpt4 key购买 nike

我想做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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com