Docker容器已安装依赖却找不到sklearn包的问题求助
问题:Docker运行时找不到sklearn依赖,导入未使用的sklearn时报错
仓库结构
dummy/ main/ hello.py requirements.txt yips/ yips/ __init__.py lol.py setup.py Dockerfile
Dockerfile内容
FROM python:3.9-bullseye WORKDIR /yips COPY yips/ ./ RUN pip3 install . WORKDIR /main COPY ./main/ . RUN pip3 install --no-cache-dir -r ./requirements.txt CMD ["python3", "hello.py"]
问题描述
运行hello.py时会导入Yips库中lol.py的方法,测试时在lol.py中导入了sklearn但未实际使用。requirements.txt包含sklearn和numpy(numpy在hello.py中可正常使用)。运行Docker镜像时提示找不到sklearn,但删除lol.py中的sklearn导入后程序正常运行。曾尝试在安装Yips库前直接执行pip install sklearn,问题依旧。
解决思路
1. 修正Yips库的setup.py依赖声明
由于lol.py中导入了sklearn,需要在Yips库的setup.py中明确声明该依赖,确保安装Yips时自动安装对应包。注意Python包索引中sklearn的正式包名为scikit-learn,而非sklearn:
from setuptools import setup, find_packages setup( name="yips", version="0.1", packages=find_packages(), install_requires=[ "scikit-learn>=1.0", # 可根据需求指定版本范围 ] )
2. 调整Dockerfile中的安装顺序
先安装所有依赖再安装本地库,避免依赖安装顺序导致的环境异常:
FROM python:3.9-bullseye # 先安装main模块的依赖 WORKDIR /app COPY main/requirements.txt ./ RUN pip3 install --no-cache-dir -r requirements.txt # 再安装Yips本地库 WORKDIR /app/yips COPY yips/ ./ RUN pip3 install . # 切换到main目录运行程序 WORKDIR /app/main COPY main/ . CMD ["python3", "hello.py"]
3. 修正requirements.txt中的包名
将requirements.txt中的sklearn替换为正式包名scikit-learn,避免别名导致的安装异常:
scikit-learn numpy
内容的提问来源于stack exchange,提问作者David3186
相关产品推荐
相关产品推荐

