如何在C++中使用枚举并对接Cython?求解.pyx文件实现
对接C++枚举与Cython的实现方案
首先修正你的MyWork.pxd文件——原代码里枚举的定义错误,C++中的枚举是Task,不是_MyWork,修正后的pxd如下:
# MyWork.pxd cdef extern from "MyWork.h": # 正确映射C++的Task枚举 cdef enum Task: REGULAR, DEV, MARKETING # 映射C++的_MyWork类 cdef cppclass _MyWork: _MyWork() int get_my_work_id(Task value)
接下来是MyWork.pyx的实现,核心是在Cython类中持有C对象实例,处理Python到C枚举的类型转换,并调用C++方法:
# MyWork.pyx cdef class MyWork: # 持有C++ _MyWork类的实例指针 cdef _MyWork* cpp_obj def __cinit__(self): # 初始化C++对象 self.cpp_obj = new _MyWork() def __dealloc__(self): # 释放C++对象,避免内存泄漏 del self.cpp_obj # 将C++枚举暴露到Python层面,方便用户直接使用 REGULAR = REGULAR DEV = DEV MARKETING = MARKETING def get_my_work_id(self, value): # 定义Cython层面的Task变量,用于传递给C++方法 cdef Task task_val # 处理Python传入的参数:支持字符串或整数映射到枚举 if isinstance(value, str): task_map = { "REGULAR": self.REGULAR, "DEV": self.DEV, "MARKETING": self.MARKETING } try: task_val = task_map[value] except KeyError: raise ValueError(f"Invalid task string: {value}. Choose from REGULAR, DEV, MARKETING") elif isinstance(value, int): # 直接转换为Task枚举(确保整数和C++枚举值一致) task_val = <Task>value else: raise TypeError("Unsupported input type. Use string (e.g. 'REGULAR') or integer matching the enum value.") # 调用C++对象的方法并返回结果 return self.cpp_obj.get_my_work_id(task_val)
补充说明
- 类名修正:你原pyx里写的
Triangle是笔误,应该改为MyWork,和业务逻辑对应。 - 枚举暴露:通过在Cython类中定义同名属性,把C++枚举的常量暴露到Python层面,用户可以直接用
MyWork.REGULAR来传参。 - 类型转换:Python无法直接识别Cython的枚举类型,所以需要在方法里把Python的输入(字符串或整数)转换成Cython的
Task枚举,再传递给C++方法。 - 编译配置:需要编写
setup.py来编译Cython代码,示例如下:
# setup.py from setuptools import setup, Extension from Cython.Build import cythonize import os # 指向你的CPP目录路径 cpp_directory = "../CPP" ext_modules = [ Extension( name="MyWork", sources=["MyWork.pyx", os.path.join(cpp_directory, "MyWork.cpp")], include_dirs=[cpp_directory], language="c++", extra_compile_args=["-std=c++11"], extra_link_args=["-std=c++11"] ) ] setup( name="MyWork", ext_modules=cythonize(ext_modules) )
编译时执行python setup.py build_ext --inplace即可生成可导入的Python扩展模块。
内容的提问来源于stack exchange,提问作者Punreach Rany
相关产品推荐
相关产品推荐

