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

2024-06-16 11:19:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在研究一个C++项目,它需要被包裹在Cython中,最终在Python中使用集成测试。我有一个全局变量用来默认我的C++头文件中函数的值,它看起来像

header file
const uint8_t kAudioLevel = 0x5a;

这是在C++文件中的函数,比如

void func(uint audioLevel=kAudioLevel)

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

DEF kAudioLevel

此默认值传递到C++中的函数()包装器中,以允许该值默认值。但是,我真的希望包装中使用的这个变量直接从头文件导入,因此我只有一个真实来源,不必每次更改两次这个变量。我尝试添加以下内容:

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的文档,但没有发现任何有用的东西


Tags: 文件项目函数头文件cythonfileheaderfunc
1条回答
网友
1楼 · 发布于 2024-06-16 11:19:09

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

#ifndef CPY_HH
#define CPY_HH

#include <cstdint>

const uint8_t kAudioLevel = 5;

#endif

cytest.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)

相关问题 更多 >