
本文详解 Ubuntu 20.04 下使用 python3 -m venv 创建的虚拟环境中 Jupyter 启动失败(如 ModuleNotFoundError: No module named 'jupyterlab')的根本原因,涵盖路径冲突、内核注册缺失、依赖混淆等核心问题,并提供安全、可复现的修复步骤。
本文详解 ubuntu 20.04 下使用 `python3 -m venv` 创建的虚拟环境中 jupyter 启动失败(如 `modulenotfounderror: no module named 'jupyterlab'`)的根本原因,涵盖路径冲突、内核注册缺失、依赖混淆等核心问题,并提供安全、可复现的修复步骤。
在 Ubuntu 20.04 中,使用 python3 -m venv .venv 创建虚拟环境后执行 jupyter notebook 却报错 ModuleNotFoundError: No module named 'jupyterlab',表面看是缺包,实则暴露了虚拟环境隔离失效与命令解析路径污染两大关键问题。错误日志中关键线索是:
File "/home/della/.local/bin/jupyter-notebook", line 5, in <module> from notebook.app import main File "/home/della/.local/lib/python3.8/site-packages/notebook/app.py", line 20, in <module> from jupyterlab.commands import ...</module></module>
注意路径:/home/della/.local/bin/... 和 /home/della/.local/lib/... —— 这些完全不在你的 .venv 目录下,说明系统正调用用户级(--user 安装)的 jupyter 可执行文件,而非虚拟环境内安装的版本。这是典型的 PATH 优先级误配:~/.local/bin 位于 PATH 前置位置,覆盖了 ./.venv/bin。
✅ 正确诊断与验证步骤
首先确认当前 shell 是否真正使用虚拟环境内的 jupyter:
# 激活环境后立即执行 source .venv/bin/activate which jupyter # ✅ 正确输出应为: # /home/della/Python_scripts/email-classification/.venv/bin/jupyter # 若仍显示 ~/.local/bin/jupyter,则说明 PATH 被污染,需临时修正: export PATH="./.venv/bin:$PATH" which jupyter # 再次验证
同时检查 jupyter 是否真正在虚拟环境中安装:
(.venv) $ python -m pip list | grep -i "jupyter\|notebook\|lab" # 应看到 jupyter, notebook, jupyterlab, ipykernel 等均存在且无 `*user*` 标记
⚠️ 注意:pip_requirements.txt 中同时声明 jupyterlab、jupyter 和 notebook 是冗余且危险的——jupyter 元包已隐式依赖 notebook,而 jupyterlab 与 notebook 共存时若版本不兼容(如 notebook>=7.0 与旧版 jupyterlab
# pip_requirements.txt(推荐写法) jupyterlab>=4.2.0 ipykernel>=6.29.0
✅ 彻底修复方案(三步到位)
1. 清理外部污染,强制使用 venv 内命令
# 临时重置 PATH(推荐每次激活后执行) source .venv/bin/activate export PATH="./.venv/bin:$PATH" # 验证:确保所有 jupyter 相关命令来自 venv which jupyter jupyter-notebook jupyter-lab # 输出均应指向 .venv/bin/ 下的可执行文件
2. 重新安装并显式注册内核(关键!)
仅安装包不足以让 Jupyter 识别 Python 内核。必须在激活的 venv 中注册内核:
(.venv) $ python -m ipykernel install --user --name email-classification --display-name "Python (email-classification)"
? 说明:--user 参数在此处必须保留(因内核配置全局生效),但 --name 必须唯一且语义化;--display-name 将显示在 Jupyter 界面右上角内核选择菜单中。运行后可通过 jupyter kernelspec list 确认是否注册成功。
3. 启动并验证
(.venv) $ jupyter lab # 推荐优先使用 JupyterLab(更现代稳定) # 或 (.venv) $ jupyter notebook
✅ 成功启动后,在浏览器新建 Notebook → 右上角 Kernel → 选择 Python (email-classification) → 运行测试代码:
import sys
print("Python executable:", sys.executable)
print("JupyterLab version:", __import__('jupyterlab').__version__)
输出中的 sys.executable 应为 ./.venv/bin/python,证明完全运行在隔离环境中。
? 重要注意事项
- 永远不要混用 sudo pip 与普通 pip:sudo pip install 会将包写入系统路径,破坏 venv 隔离性,且易引发权限冲突。
- 避免 ~/.local/bin 干扰:若需长期解决,可在 ~/.bashrc 中注释或删除类似 export PATH="$HOME/.local/bin:$PATH" 的行,或将其移至 PATH 末尾。
- 不推荐 pip install jupyter 单独安装:应统一使用 jupyterlab(含 notebook 功能)或至少 pip install notebook ipykernel 组合,避免元包版本撕裂。
- WSL2 用户额外提示:若使用 WSL2,确保 Windows 端浏览器能访问 http://localhost:8888;必要时添加 --no-browser --ip=0.0.0.0 并配置防火墙。
通过以上操作,你将获得一个纯净、可复现、内核明确的 Jupyter 开发环境——这不仅是解决报错,更是构建可靠数据科学工作流的工程基石。











