Docker打包后Python模块导入失败问题求助
Python项目Docker容器运行时模块导入错误
问题背景
本地运行正常的Python项目,经Docker打包后运行容器时出现模块导入错误。项目包含Dockerfile、app.py及detection目录(含__init__.py和yolo_config.py)。尝试两种导入方式均报错,已添加__init__.py并配置PYTHONPATH,问题仍未解决。
目录结构
├── Dockerfile ├── app.py ├── detection │ ├── __init__.py │ ├── yolo_config.py
相关代码
yolo_config.py
class YoloConfig: args = { "ENV": "dev", }
app.py
from detection.yolo_config import YoloConfig if __name__ == '__main__': print(YoloConfig.args)
Dockerfile内容
FROM pytorch/pytorch:2.0.1-cuda11.7-cudnn8-runtime # 显示Python模块路径 RUN python -c "import sys; print(sys.path)" # 检查Python版本 RUN python --version # 创建工作目录 WORKDIR /usr/src/ultralytics # 复制整个项目到容器 COPY . /usr/src/ultralytics # 设置PYTHONPATH ENV PYTHONPATH=/usr/src/ultralytics # 打印当前目录及文件 RUN pwd RUN ls -a ...... # 暴露端口 EXPOSE 5000 # 启动命令 CMD ["python", "app.py"]
错误信息
此前错误(使用from detection import yolo_config时)
Traceback (most recent call last): File "/usr/src/ultralytics/app.py", line 11, in <module> from detection import yolo_config ImportError: cannot import name 'yolo_config' from 'detection' (/usr/src/ultralytics/detection/__init__.py)
当前错误(使用from detection.yolo_config import YoloConfig时)
Traceback (most recent call last): File "/usr/src/ultralytics/app.py", line 10, in <module> from detection.yolo_config import YoloConfig ModuleNotFoundError: No module named 'detection.yolo_config'
解决方案
1. 完善__init__.py导出
第一种导入方式报错是因为detection模块的__init__.py没有导出yolo_config模块或YoloConfig类。在detection/__init__.py中添加以下内容:
# 导出类,支持from detection import YoloConfig from .yolo_config import YoloConfig # 或者导出模块,支持from detection import yolo_config # import detection.yolo_config as yolo_config
2. 验证文件复制完整性
在Dockerfile中添加命令,确认yolo_config.py已被正确复制到容器:
RUN ls -la /usr/src/ultralytics/detection/
构建镜像时查看输出,确保文件存在。
3. 修正PYTHONPATH设置
直接覆盖PYTHONPATH可能丢失基础镜像原有路径,改为追加方式更稳妥:
ENV PYTHONPATH="${PYTHONPATH}:/usr/src/ultralytics"
4. 以模块方式运行脚本
改用模块方式启动app.py,让Python按模块结构解析导入:
修改Dockerfile的启动命令:
CMD ["python", "-m", "app"]
同时app.py中的导入可以保持不变,或者改用相对导入(不推荐用于生产):
from .detection.yolo_config import YoloConfig
5. 确认工作目录与脚本路径
虽然已设置WORKDIR,但可以用绝对路径启动脚本验证:
CMD ["python", "/usr/src/ultralytics/app.py"]
内容的提问来源于stack exchange,提问作者石卓凡
相关产品推荐
相关产品推荐

