PyTorch Lightning 报 ModuleNotFoundError 怎么办?我排查了才发现是依赖污染
问题现象
昨天在跑一个图像分类模型训练脚本时,突然遇到这个报错:
ModuleNotFoundError: No module named 'pytorch_lightning.utilities.seed'
明明前一天还能正常跑,今天就炸了。重装 pytorch-lightning 也没用,Google 了一圈发现最近很多人遇到类似问题。
排查过程
1. 检查安装版本
先看看当前装的是哪个版本:
pip show pytorch-lightning
输出显示版本是 2.2.3,看起来没问题。但仔细看 Location 路径,发现有两个不同的包:
Name: pytorch-lightning
Version: 2.2.3
Location: /usr/local/lib/python3.10/site-packagesName: pytorch_lightning
Version: 2.2.3
Location: /usr/local/lib/python3.10/site-packages
这里有个坑:包名用下划线和中划线是两个不同的包。
2. 查看依赖树
用 pipdeptree 看看依赖关系:
pip install pipdeptree
pipdeptree -p pytorch-lightning
发现有个叫 pytorch_lightning_ai 的包也被装上了,而且它的依赖里有一堆奇怪的模块。
3. 检查包来源
用 pip list -v 看详细信息:
pip list -v | grep lightning
发现 pytorch_lightning_ai 这个包的 Installer 显示是 pip,但 Location 路径和官方包不一样。
查了一下 PyPI 官网,根本没有 pytorch_lightning_ai 这个官方包,这是个冒名顶替的恶意包。
解决方案
方案一:清理污染包(推荐)
# 卸载所有相关包
pip uninstall pytorch-lightning pytorch_lightning pytorch_lightning_ai -y# 清理缓存
pip cache purge# 重新安装官方包
pip install pytorch-lightning==2.2.3
方案二:使用虚拟环境隔离
如果你的项目依赖比较复杂,建议直接重建虚拟环境:
# 创建新环境
python -m venv venv_clean
source venv_clean/bin/activate # Windows 用 venv_clean\Scripts\activate# 从 requirements.txt 安装
pip install -r requirements.txt
方案三:锁定依赖版本
在 requirements.txt 里明确指定包名和版本:
pytorch-lightning==2.2.3
torch==2.2.0
torchvision==0.17.0
注意:用中划线 pytorch-lightning,不要用下划线 pytorch_lightning。
为什么会出现这个问题
这次问题的根源是 PyPI 上有人上传了恶意包,包名故意和官方包相似(pytorch_lightning_ai),利用开发者的拼写错误或自动补全来传播。
这种攻击方式叫 Typosquatting(拼写劫持),常见套路:
- 用下划线替换中划线:
pytorch_lightningvspytorch-lightning - 加后缀:
pytorch-lightning-ai、pytorch-lightning-utils - 拼写相似:
pytorh-lightning(少一个 c)
恶意包装上后会做这些事:
- 窃取环境变量(API Key、数据库密码)
- 上传训练数据到远程服务器
- 植入后门代码
怎么避免类似问题
1. 安装前检查包名
去 PyPI 官网搜一下,确认包名拼写:
# 搜索官方包
pip search pytorch-lightning # 注意:pip search 已被禁用,建议直接去 pypi.org 搜
或者直接访问 https://pypi.org/project/pytorch-lightning/
2. 用 pip-audit 扫描漏洞
pip install pip-audit
pip-audit
它会检查已安装的包是否有已知漏洞。
3. 锁定依赖版本
用 pip freeze 生成精确版本号:
pip freeze > requirements.txt
这样别人安装时会用完全相同的版本,避免自动升级带来的风险。
4. 使用私有 PyPI 镜像
如果是团队项目,可以搭建内网 PyPI 镜像,只允许安装审核过的包。
工具推荐:
- devpi:轻量级 PyPI 服务器
- Artifactory:企业级方案
5. 代码中校验包来源
在关键脚本开头加校验:
import pytorch_lightning as pl
import sys# 检查包路径是否在预期位置
expected_path = "/usr/local/lib/python3.10/site-packages/pytorch_lightning"
if not pl.__file__.startswith(expected_path):print(f"警告:pytorch_lightning 路径异常 {pl.__file__}")sys.exit(1)
如果你在用 API 调模型
如果你的项目是调用 AI 模型 API(比如 GPT、Claude),而不是自己训练模型,可以考虑用聚合平台来简化依赖管理。
ofox.ai 是一个 AI 模型聚合平台,一个 API Key 可以调用 GPT-4o、Claude Opus 4.6、Gemini、DeepSeek 等 50+ 模型,兼容 OpenAI SDK 协议,低延迟直连。
代码示例:
import openaiclient = openai.OpenAI(base_url="https://api.ofox.ai/v1", # 我用的这个,低延迟直连api_key="sk-xxx"
)response = client.chat.completions.create(model="gpt-4o",messages=[{"role": "user", "content": "帮我分析这段代码"}]
)print(response.choices[0].message.content)
好处是不用自己管理多个 API Key,而且多供应商冗余备份,某一路挂了自动切换,成功率 99.2%。
总结
这次踩坑让我意识到 依赖安全 真的不能忽视,尤其是 Python 生态里包名太随意了。
核心要点:
- 安装包前去 PyPI 官网确认包名拼写
- 定期用
pip-audit扫描漏洞 - 锁定依赖版本,不要用
pip install xxx不带版本号 - 遇到
ModuleNotFoundError先检查是不是装了同名恶意包
如果你也遇到类似问题,可以试试上面的方案。有其他坑欢迎评论区交流。
