运行docker-events-pushover容器遇ImportError:无法导入pushover的init
- 运行的容器基于自己此前拼凑后分叉优化的代码,之前可正常运行,最近变更后出现导入错误:
Traceback (most recent call last):
File "/usr/src/app/app.py", line 20, in
from pushover import init, Client
ImportError: cannot import name 'init' from 'pushover' (/usr/src/app/src/python-pushover/pushover/init.py)
- 容器拉取的是指定python-pushover仓库的代码,已确认镜像内存在
/usr/src/app/src/python-pushover/pushover/__init__.py文件,尝试删除并重新拉取容器后问题依旧,且无法联系到容器代码的维护者。
检查
__init__.py实际内容
进入容器查看目标文件的代码,确认init函数是否存在:docker exec -it <容器ID/名称> cat /usr/src/app/src/python-pushover/pushover/__init__.py如果文件中无
init函数,说明依赖库的代码已发生变更——大概率是镜像拉取了最新版的python-pushover,而原代码适配的是旧版本API。适配API变更
若init函数被移除或重命名,修改app.py的调用逻辑。例如原代码使用init初始化token的写法,可替换为直接在Client初始化时传入token:# 原代码 init("your_api_token") client = Client("your_user_key") # 修改后 client = Client("your_user_key", api_token="your_api_token")锁定依赖版本
若不想修改代码,可在Dockerfile中指定拉取python-pushover的特定版本(提交哈希或标签),确保使用之前正常运行的版本:RUN git clone <目标python-pushover仓库地址> /usr/src/app/src/python-pushover && \ cd /usr/src/app/src/python-pushover && \ git checkout <正常版本的提交哈希/标签>重新构建镜像并运行容器。
校验Python模块路径
确认容器内Python的模块搜索路径包含目标目录:docker exec -it <容器ID/名称> python3 -c "import sys; print(sys.path)"如果
/usr/src/app/src/python-pushover不在路径中,可在app.py开头添加:import sys sys.path.append('/usr/src/app/src/python-pushover')或在Dockerfile中设置环境变量:
ENV PYTHONPATH="/usr/src/app/src/python-pushover:${PYTHONPATH}"排查模块冲突
检查容器内是否通过pip安装了其他版本的pushover包,避免和本地克隆的模块冲突:docker exec -it <容器ID/名称> pip list | grep pushover若存在,执行卸载命令:
docker exec -it <容器ID/名称> pip uninstall -y pushover
内容的提问来源于stack exchange,提问作者Derek O'Harrow

