pip uninstall 了一个本地包,pip list 里已经没有它,python -c 'import mypkg' 还是成功。site-packages 下留着一个 mypkg.pth,里面写着旧源码目录。日志里能对上时间点,这种反而好排。
pth 是启动时被 site 模块读取的纯文本,每一行都会被加进 sys.path。pip 卸载只按安装记录删文件,手工放进去或旧版本留下的 pth 不在记录里。这一点先确认清楚,后面就不用反复试。
python -c "import sys; print('\n'.join(sys.path))"
python -c "import site; print(site.getsitepackages())"
围绕「pth 文件残留」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。
别只看报错的最后一行,往上看几行,真正的起因通常在上面。同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。
把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。
处理上按这个顺序:打印 sys.path 看多出来的目录 确认来自哪个 pth;到 site-packages 下按包名找 pth 和 egg-link 文件;把 pth 删掉 同时清掉对应目录的 __pycache__;开个新进程再 import 确认找不到 才算清干净。
结果对不对很好判断,import 抛 ModuleNotFoundError site-packages 下不再有对应的 pth 和 egg-link。
