pip list 里明明有某个包,运行脚本依然报 ModuleNotFoundError。几乎都是装着包的 Python 和跑代码的 Python 不是同一个。

先确认解释器路径

python -c "import sys; print(sys.executable)"
pip -V
which python3

两条输出指向不同目录,问题就找到了。系统里同时有 python、python3、conda、pyenv 时很常见。

用解释器本身装包

python -m pip install 包名

强制用当前解释器执行 pip,能避免装到别的环境。虚拟环境里更要用这种方式,不要直接敲全局的 pip。

另外三种坑

  • 包名和导入名不同,比如 Pillow 对应 PIL
  • 当前目录有同名文件,把自己的脚本遮蔽了标准库
  • IDE 里配置的解释器还是系统默认,没切到 venv

排查时直接在报错的那行之前打印 sys.path,看包的安装路径在不在列表里,一眼就能判断是路径问题还是真的没装。

容器和服务器上的高频场景

用 supervisor 或 systemd 拉起脚本时,working directory 和 PATH 跟交互式登录不一样,pip 装到了用户目录,服务进程读不到。给服务显式指定虚拟环境的解释器路径最稳。

如果是 CI 里报错,检查安装和运行两步是否在同一个镜像、同一个阶段。分成两个 job 时依赖不会自动带过去,需要在运行阶段重新安装或复用缓存。

python -c "import 包名; print(包名.__file__)"

能打印出文件路径,说明导入没问题,报错就在别的环节,比如子进程用了另一套环境。

作者 9823189