如何从c++头文件中导入全局变量以在Cython中使用



我正在处理一个c++项目,该项目需要用Cython封装,以便最终在Python的集成测试中使用。我有一个全局变量,用于在我的c++头文件中的函数中默认值,看起来像

header file
const uint8_t kAudioLevel = 0x5a;

这在c++文件中的函数中使用,如

void func(uint audioLevel=kAudioLevel)

我在Cython中包装了这个函数,并且目前有另一个变量与我的.pyx文件中使用的名称相同,如

DEF kAudioLevel

这个默认值在c++中被传递到func()包装器中,以允许该值为默认值。然而,我真的希望包装器中使用的这个变量直接从头文件导入,这样我就有了一个单一的事实来源,而不必每次都更改这个变量两次。我尝试添加以下内容:

pxd file
cdef extern from "header.h":
cdef cppclass Class:
int kAudioLevel

然后尝试直接在。pyx文件中使用kAudioLevel,像这样

def func(audioLevel = kAudioLevel):
return client.func(audioLevel)

这允许我们在Cython和c++中使用默认值,而不需要编辑两次。但是,当我尝试这样做时,没有找到变量。不确定我是否必须将头类添加到pxd和pyx文件以及如何做到这一点。我看了Cython的文档,但没有找到任何有用的。

对于cpy.hh这样的const成员:

#ifndef CPY_HH
#define CPY_HH
#include <cstdint>
const uint8_t kAudioLevel = 5;
#endif

withcytest.pyx:

from libc.stdint cimport uint8_t
cdef extern from "cpy.h":
cdef uint8_t kAudioLevel

允许我在.pyx文件中使用kAudioLevel。使用exposedKAudioLevel = kAudioLevel,我可以将其暴露给模块外部。

如果你想要一个真正的全局变量,那就有点复杂了,但是对于cpy.hh:

#ifndef CPY_HH
#define CPY_HH
#include <cstdint>
extern uint8_t kAudioLevel;
#endif

cpy.cc:

#include "cpy.hh"
uint8_t kAudioLevel = 5;

和上面相同的cytest.pyx,我可以从.pyx.cc创建一个我可以访问和修改的变量。

不幸的是,kAudioLevel没有暴露给外部导入器,因此要访问/修改,就需要辅助函数,如getVal(),setVal(newVal),据我所知。

最新更新