pip如何按requirements.txt指定版本构建wheel解决依赖冲突
问题描述
现有requirements.txt依赖文件内容如下:
matplotlib==3.4.2 numpy==1.22.4
执行依赖安装命令(原书写命令漏写install参数,正确命令为pip install -r requirements.txt)完成部署后,运行python -c "import matplotlib"触发如下报错:
File "<string>", line 1, in <module> File "/usr/local/lib/python3.10/site-packages/matplotlib/__init__.py", line 107, in <module> from . import _api, cbook, docstring, rcsetup File "/usr/local/lib/python3.10/site-packages/matplotlib/rcsetup.py", line 26, in <module> from matplotlib.colors import Colormap, is_color_like File "/usr/local/lib/python3.10/site-packages/matplotlib/colors.py", line 82, in <module> from matplotlib import _api, cbook, scale File "/usr/local/lib/python3.10/site-packages/matplotlib/scale.py", line 18, in <module> from matplotlib.ticker import ( File "/usr/local/lib/python3.10/site-packages/matplotlib/ticker.py", line 179, in <module> from matplotlib import transforms as mtransforms File "/usr/local/lib/python3.10/site-packages/matplotlib/transforms.py", line 46, in <module> from matplotlib._path import ( ImportError: numpy.core.multiarray failed to import
已知环境约束:
- 运行环境为Python 3.10
- 项目依赖numba,其版本要求
numpy<1.23,无法将numpy升级至1.23及以上版本 - 报错根因为:pip安装matplotlib构建wheel包时,默认的隔离构建环境会拉取满足构建要求的最新numpy(1.23版本)完成C扩展编译,代码运行时加载的是requirements.txt指定的numpy 1.22.4版本,numpy C扩展跨小版本不兼容导致导入失败。
解决方案
以下方案均满足numpy<1.23的版本约束,可根据实际场景选择:
- 方案1:关闭构建隔离,提前锁定numpy版本
pip默认开启构建隔离,会为每个需要源码编译的包创建独立临时环境安装构建依赖,不受requirements.txt版本约束。关闭构建隔离后,构建过程会直接复用当前环境已安装的依赖,不会临时拉取高版本numpy。
操作步骤:- 调整requirements.txt顺序,将numpy放在所有依赖的最前面,保证优先安装:
numpy==1.22.4 matplotlib==3.4.2 # 其余项目依赖(包括numba)按原有顺序填写 - 执行安装命令时添加
--no-build-isolation参数:pip install --no-build-isolation -r requirements.txt
- 调整requirements.txt顺序,将numpy放在所有依赖的最前面,保证优先安装:
- 方案2:升级matplotlib到兼容numpy 1.22.x的预编译版本
matplotlib==3.4.2发布时间早于Python 3.10正式版,没有对应Python 3.10的官方预编译wheel,安装时必然触发源码构建,容易出现构建版本和运行版本不一致问题。matplotlib==3.5.3是官方适配Python 3.10的稳定版本,兼容numpy 1.21.x~1.22.x全系列,同时满足numba的numpy版本约束,直接安装预编译包即可避免编译带来的版本问题,仅需调整requirements.txt中matplotlib版本号:matplotlib==3.5.3 numpy==1.22.4 # 其余依赖保持原有版本即可 - 方案3:通过pip约束文件强制指定构建阶段依赖版本
无需调整原有requirements.txt内容,单独创建构建约束文件build-constraints.txt,明确指定构建阶段使用的numpy版本:
安装时通过numpy==1.22.4--constraint参数加载约束,规则会同时作用于运行时依赖和构建依赖:pip install -r requirements.txt --constraint build-constraints.txt
注意:如果之前已经安装过版本不兼容的matplotlib,执行上述操作前先运行
pip uninstall -y matplotlib numpy清理旧版本,避免缓存或残留文件影响安装结果。
内容的提问来源于stack exchange,提问作者Nicolas Mauti
相关产品推荐
相关产品推荐

