根本原因是Python解释器路径不一致:Jupyter Notebook与终端命令行使用的不是同一Python环境,需通过sys.executable和which python比对路径,再统一kernel注册与PATH优先级。

Python解释器路径不一致是根本原因
你在Jupyter Notebook里能成功 import pandas,但终端执行 python script.py 却报 ModuleNotFoundError: No module named 'pandas',大概率不是没装包,而是两个地方用的压根不是同一个 Python 解释器。Jupyter 的 kernel 和命令行的 python 命令可能指向完全不同的环境:一个在 ~/venv/bin/python,另一个在 /usr/bin/python3 或 ~/.pyenv/versions/3.12/bin/python。
验证方法很简单:在 Notebook 里运行
import sys; print(sys.executable)
再在终端运行
which python
对比输出路径——只要不一致,后续所有“为什么装了还找不到”的问题都白查。
立即学习“Python免费学习笔记(深入)”;
kernel 注册和命令行 PATH 经常错位
Jupyter 不会自动把当前激活的虚拟环境变成它的 kernel;同样,source venv/bin/activate 也不会让终端里的 jupyter notebook 命令自动走这个环境——它只影响 python 和 pip,而 jupyter 是单独注册的命令入口。
- 如果你用
pip install jupyter在 venv 里装过,但没运行python -m ipykernel install --user --name myenv,那 Jupyter 启动时默认用的是系统 kernel,和你 activate 的环境无关 - 如果你在终端里直接敲
jupyter notebook,而which jupyter返回的是~/.local/bin/jupyter,说明它根本没走 venv,而是调用了用户级安装的旧版本 - 更隐蔽的是 PATH 顺序:如果
~/.local/bin出现在./venv/bin前面,哪怕你 activate 了,jupyter命令仍会被优先解析为全局版本
模块装错位置比没装更常见
你以为 pip install torch 装好了,其实它可能装进了系统 Python、用户 site-packages(~/.local/lib/python3.x/site-packages),或者另一个 conda 环境里。Jupyter 和命令行各自认各自的“家”,谁也不管对方有没有。
排查步骤:
- 在 Notebook 里运行
!pip show torch,看它说装在哪;再运行import torch; print(torch.__file__),确认实际加载路径 - 在终端里,先
which python,再用那个路径明确执行:/path/to/your/python -m pip show torch - 如果两者显示的路径不同,就说明包装错了地方——别重装,先搞清楚你想让谁用它,再用对应解释器的
pip装
conda 和 pip 混用会放大环境混乱
尤其在远程服务器或 Docker 容器里,conda 创建的环境如果用 pip 安装 Jupyter 生态(比如 pip install notebook),容易导致 jupyter_server 和 traitlets 版本错配,进而触发像 No module named 'jupyter_server.contents' 这类看似缺模块、实为版本冲突的报错。
建议:
- 用 conda 创建环境,就坚持用
conda install notebook jupyterlab - 用 venv 创建环境,就全程用
python -m pip,别碰 conda - 检查兼容性:运行
pip show traitlets notebook jupyter_server,traitlets ≥5.9.0 且 notebook 6.5.x + jupyter_server 2.7.x 是目前最稳的组合
最常被忽略的一点:Jupyter 的 kernel 是独立注册的实体,和终端当前 shell 环境没有绑定关系;而命令行的 python 执行路径又受 PATH 和 shebang 控制——这两条线一旦没对齐,导入失败就是必然结果,跟模块本身是否安装无关。


















