如何构建含指定依赖的Python Wheel并排除冲突子依赖?
解决Python Wheel构建中vtk_osmesa替代pyvista依赖vtk的问题
问题背景
要为搭载OSMesa的无头机器构建Python Wheel,需要在setup.py的install_requires中包含vtk_osmesa和pyvista,但pyvista默认依赖标准vtk包,而vtk_osmesa的库集与标准vtk不同,必须避免安装标准vtk。
可行解决方案
1. 用pip-compile管理依赖(推荐)
这种方式能精准控制依赖,避免冲突:
- 创建
requirements.in文件,写入依赖规则:vtk_osmesa>=9.2.0 pyvista>=0.40.0 --no-deps--no-deps参数会阻止pip安装pyvista的所有子依赖(包括标准vtk)。 - 运行
pip-compile生成锁定版本的requirements.txt:pip-compile requirements.in - 在
setup.py中引用生成的依赖文件:from setuptools import setup with open("requirements.txt") as req_file: install_requires = req_file.read().splitlines() setup( # 其他配置项(名称、版本等) install_requires=install_requires )
2. 直接在setup.py中指定依赖(简化版)
如果不需要版本锁定,可直接在install_requires中声明依赖,同时通过额外步骤确保标准vtk不被安装:
from setuptools import setup setup( # 其他配置项 install_requires=[ "vtk_osmesa>=9.2.0", "pyvista>=0.40.0" ] )
然后在安装Wheel时,需要加上pip参数跳过pyvista的依赖:
pip install your-wheel-file.whl --no-deps vtk_osmesa>=9.2.0 pyvista>=0.40.0
但这种方式依赖用户手动执行额外步骤,不如第一种方案可靠。
3. 预安装依赖后构建Wheel
适合临时构建场景:
- 先安装
vtk_osmesa和不带依赖的pyvista:pip install vtk_osmesa>=9.2.0 pip install pyvista>=0.40.0 --no-deps - 再执行Wheel构建:
python setup.py bdist_wheel
关键注意点
- 确认
vtk_osmesa版本与pyvista兼容,可参考pyvista官方文档的vtk版本要求,选择对应版本的vtk_osmesa。 vtk_osmesa是标准vtk的无头变体,API与标准vtk兼容,pyvista的导入和功能不会受影响。
内容的提问来源于stack exchange,提问作者Woltan
相关产品推荐
相关产品推荐

