基于python:3.9.7-slim-buster构建镜像pip安装依赖报ModuleNotFoundError
问题根因
- 核心原因是依赖清单中
carbonnow包的打包逻辑不规范:它的setup.py在执行阶段直接导入自身业务代码读取版本号,而业务代码依赖aiohttp,此时依赖还未完成安装。 - 你所用镜像默认带的pip版本较低,处理
pip install -r requirements.txt时会先遍历所有待安装包、逐个执行setup.py收集元数据,全部收集完成后才会统一安装所有依赖。哪怕aiohttp排在依赖清单第一位,在执行carbonnow的setup.py时aiohttp还未安装,就会抛出缺失模块的错误。 - 逐个安装依赖时,
aiohttp会先完成安装,后续安装carbonnow时依赖已经存在,因此不会报错。
修复方案
方案1:升级pip到最新版本
pip >=21.3版本默认采用PEP 517/518规范构建包,不会直接执行目标包的setup.py收集元数据,可直接规避这类不规范打包导致的安装问题,修改Dockerfile如下:
FROM python:3.9.7-slim-buster RUN export DEBIAN_FRONTEND=noninteractive # 先升级pip到最新版本 RUN pip3 install --upgrade pip RUN wget -O file.txt git_raw_url RUN pip3 install -r file.txt # 注意原写法CMDS是笔误,正确Dockerfile指令为CMD CMD [...]
方案2:拆分依赖安装步骤
如果不方便升级pip,可先单独安装carbonnow的前置依赖,再安装完整依赖清单:
RUN pip3 install aiohttp RUN pip3 install -r file.txt
方案3(适用于自行维护carbonnow包的场景)
修改carbonnow的打包逻辑,不要在setup.py中导入业务代码读取版本号,可通过正则匹配直接读取版本文件内容,或采用pyproject.toml静态声明版本号,符合Python打包规范要求。
内容的提问来源于stack exchange,提问作者Anonymous
相关产品推荐
相关产品推荐

