如何从C++头文件导入全局变量供Cython使用
首先修正你.pxd文件中的声明错误:你之前将全局常量kAudioLevel错误嵌套到了cppclass的类成员声明中,而它本身是头文件全局作用域的常量,不需要放在类声明内。
第一步:编写正确的pxd声明
假设你的pxd文件名为cpp_wrapper.pxd,内容如下:
# 先导入C++标准类型,匹配uint8_t的定义 cdef extern from "<cstdint>" namespace "std": ctypedef unsigned char uint8_t ctypedef unsigned int uint cdef extern from "header.h": # 全局常量直接声明在extern块顶层,不要放到cppclass内 const uint8_t kAudioLevel # 你的C++类和函数声明 cdef cppclass Class: Class() except + void func(uint audioLevel = kAudioLevel)
你可以直接在C++函数声明中保留默认值,Cython会自动识别并关联头文件中的常量定义。
第二步:在pyx文件中封装调用
有两种常用方案实现单源默认值:
方案1(推荐):利用C++原生默认参数
无需在Python侧显式调用kAudioLevel,用None作为占位符判断,完全复用C++侧的默认值逻辑:
cimport cpp_wrapper cdef class PyClient: cdef cpp_wrapper.Class *client def __cinit__(self): self.client = new cpp_wrapper.Class() def __dealloc__(self): if self.client: del self.client def func(self, audioLevel = None): if audioLevel is None: # 直接调用无参版本,Cython自动用C++侧的默认值 self.client.func() else: self.client.func(<cpp_wrapper.uint>audioLevel)
方案2:直接在Python参数列表使用常量
如果需要在Python函数的参数列表中显式标注默认值,做一层类型转换即可:
from cpp_wrapper cimport kAudioLevel, Class cdef Class *client = new Class() def func(audioLevel = <object><int>kAudioLevel): return client.func(<uint>audioLevel)
注意Cython的def函数默认参数需要是Python对象,因此需要先把C类型的uint8_t转为C的int再转成Python的int对象。
内容的提问来源于stack exchange,提问作者Daniel Mireles
相关产品推荐
相关产品推荐

