如何用Poetry结合Meson构建含Cython的Python包并正确安装?
解决Poetry + Mesonpy构建含Cython/C++的Python包的导入问题
1. 核心配置文件修正
首先确保pyproject.toml同时正确配置Poetry依赖管理和Meson构建后端,避免路径冲突:
[build-system] requires = ["meson-python>=0.13.0", "cython>=0.29.30", "meson>=1.2.0"] build-backend = "mesonpy" [project] name = "sktree" version = "0.1.0" packages = ["sktree"] [tool.poetry] name = "sktree" version = "0.1.0" authors = ["Your Name <your@email.com>"] packages = [{ include = "sktree" }] [tool.poetry.dependencies] python = "^3.9" numpy = "^1.24.0" scikit-learn = "^1.2.0" [tool.meson-python.args] setup = ["--buildtype=debugoptimized"]
2. Meson.build 匹配Python包结构
关键是让Cython编译后的扩展模块安装到对应Python包的子目录下,确保导入路径一致。以下是适配sktree.tree模块的示例:
project('sktree', 'cpp', 'python', version : '0.1.0', default_options : ['cpp_std=c++17']) python = import('python') py = python.find_installation() # 导入Cython编译工具 cy = import('cython') # 编译_unsup_criterion.pyx,指定安装到sktree/tree目录 cython_module( '_unsup_criterion', sources : ['sktree/tree/_unsup_criterion.pyx'], include_directories : [ py.get_install_dir() / 'numpy' / 'core' / 'include', include_directories('sktree/tree') ], install_dir : py.get_install_dir() / 'sktree' / 'tree', dependencies : [py.dependency()], ) # 如果关联C++代码,添加静态库编译并链接到Cython模块 cpp_lib = static_library( 'tree_utils', sources : ['sktree/tree/criterion_impl.cpp'], cpp_args : ['-O3', '-Wall'], include_directories : include_directories('sktree/tree') ) # 带C++依赖的Cython模块示例 cython_module( '_another_criterion', sources : ['sktree/tree/_another_criterion.pyx'], include_directories : [include_directories('sktree/tree')], link_with : [cpp_lib], install_dir : py.get_install_dir() / 'sktree' / 'tree', dependencies : [py.dependency()], )
3. 正确执行安装(开发/生产模式)
开发模式(可编辑安装)
Meson-python 0.13+支持可编辑安装,直接在Poetry虚拟环境中执行:
# 激活虚拟环境 poetry shell # 安装依赖并构建扩展模块 poetry install --editable
如果遇到问题,也可以在虚拟环境中直接用pip执行:
pip install -e .
解决单独Meson安装到Homebrew的问题
单独使用Meson时,必须指定Poetry虚拟环境的Python路径作为安装前缀:
# 在Poetry虚拟环境中执行 meson setup build --prefix=$(poetry run python -c "import sys; print(sys.prefix)") meson install -C build
4. 导入错误排查要点
- 检查虚拟环境的
site-packages/sktree/tree/目录下是否存在_unsup_criterion.so(Linux/macOS)或_unsup_criterion.pyd(Windows) - 确认
meson.build中的install_dir严格对应Python包的子路径(sktree/tree) - 验证Python代码中的导入语句路径:
from sktree.tree._unsup_criterion import Criterion,避免相对路径错误
内容的提问来源于stack exchange,提问作者ajl123
相关产品推荐
相关产品推荐

