我正在处理一个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)
,据我所知。