求基于src布局、使用meson-python打包的Cython项目最小示例及测试配置
基于src布局+Meson-Python+Cython的最小项目示例
完整目录结构
my_cython_project/ ├── pyproject.toml ├── meson.build ├── src/ │ └── mycythonpkg/ │ ├── __init__.py │ └── math_ops.pyx └── tests/ ├── __init__.py └── test_math_ops.py
1. pyproject.toml 核心配置
指定构建系统依赖与项目基础信息:
[build-system] requires = ["meson-python>=0.13.0", "cython>=3.0.0"] build-backend = "mesonpy" [project] name = "mycythonpkg" version = "0.1.0" authors = [{ name = "Your Name", email = "your@email.com" }] description = "Minimal Cython project using src layout and meson-python" requires-python = ">=3.8"
2. meson.build 编译配置
处理Cython扩展编译与src布局适配:
project('mycythonpkg', 'python', version : '0.1.0', default_options : ['warning_level=3']) # 导入Python与Cython模块 py = import('python') cy = import('cython') # 安装Python包的纯Python文件 py.install_sources( 'src/mycythonpkg/__init__.py', subdir : 'mycythonpkg' ) # 编译Cython文件为C扩展 cython_ext = cy.cython( 'src/mycythonpkg/math_ops.pyx', output : 'math_ops' ) # 构建并安装扩展模块,对应src下的包路径 py.extension_module( 'math_ops', cython_ext, install : true, install_dir : 'mycythonpkg' )
3. src目录下的包文件
src/mycythonpkg/init.py
导出Cython扩展的功能,简化外部调用:
from .math_ops import add_numbers __all__ = ['add_numbers']
src/mycythonpkg/math_ops.pyx
简单的Cython示例代码:
def add_numbers(int a, int b): return a + b
4. tests目录配置与使用
tests目录放在项目根目录(与src同级),符合Python项目常规布局:
tests/test_math_ops.py
测试示例代码:
import mycythonpkg def test_add_numbers(): assert mycythonpkg.add_numbers(2, 3) == 5 assert mycythonpkg.add_numbers(-1, 1) == 0
运行测试步骤
- 以可编辑模式安装项目(方便开发时实时更新):
pip install -e .
- 安装测试依赖(如pytest):
pip install pytest
- 执行测试:
pytest tests/ -v
关键注意事项
- meson.build中,
py.install_sources的subdir和py.extension_module的install_dir必须与src下的包名完全一致,确保Python能正确识别包结构。 - 修改Cython代码后,需重新运行
pip install -e .触发重新编译。 - 确保meson-python与Cython的版本满足pyproject.toml中的最低要求,避免兼容性问题。
内容的提问来源于stack exchange,提问作者David H
相关产品推荐
相关产品推荐

