Python 3.3+ 直接用 python -m venv 创建虚拟环境,需指定空目录或不存在路径;若报 ModuleNotFoundError: No module named 'venv',说明使用了 Python 2 或过旧的 Python 3 版本。

Linux下用python -m venv创建虚拟环境的正确姿势
直接用系统自带的 venv 模块,不需要额外装 virtualenv 或 pip install venv —— 那是过时做法,Python 3.3+ 已内置。关键点是:必须指定一个**空目录名或不存在的路径**作为环境位置,不能写成 python -m venv 后不带参数。
常见错误现象:ModuleNotFoundError: No module named 'venv',说明你用的是 Python 2 或太老的 Python 3(
- 确认 Python 版本:运行
python --version或python3 --version,确保 ≥3.3 - 推荐命名惯例:用
.venv(点开头,Git 默认忽略)或venv,避免用env这类易冲突名 - 如果系统有多个 Python 版本(如
python3.8、python3.10),显式调用对应解释器:例如/usr/bin/python3.8 -m venv .venv - 不要在 root 权限下创建(除非真有必要),否则可能引发权限混乱和
pip安装失败
激活前先检查 pyvenv.cfg 和路径结构
创建完后别急着 source,先看一眼生成的目录里有没有 pyvenv.cfg 文件,以及 bin/(不是 Scripts/)是否存在。Linux 下结构固定为:.venv/bin/python、.venv/bin/pip、.venv/pyvenv.cfg。缺任何一个,说明创建失败或路径被覆盖。
容易踩的坑:source .venv/bin/activate 报错 No such file or directory,大概率是创建时用了 Windows 风格路径(比如误加了反斜杠)、或当前 shell 不是 bash/zsh(如 fish 用户需换用 source .venv/bin/activate.fish)。
立即学习“Python免费学习笔记(深入)”;
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
- 检查是否真生成了
bin/:运行ls -F .venv/,应看到bin/、lib/、pyvenv.cfg - 确认
pyvenv.cfg内容里home =指向的是你期望的 Python 解释器路径(比如/usr/bin/python3.10) - 若用非 bash shell(如 zsh),激活后
which python仍返回系统路径,可能是activate脚本未适配;可临时改用source .venv/bin/activate.csh(csh/tcsh)或手动设置PYTHONPATH
--system-site-packages 什么时候该加、什么时候不该加
默认情况下,venv 创建的是完全隔离的环境,不继承系统已装的包。加 --system-site-packages 是个双刃剑:能省空间、加速安装大型科学计算包,但也会让环境行为变得不可预测——尤其当系统级包更新后,你的项目可能悄无声息地“变味”。
适用场景很窄:本地快速验证、CI 构建中复用缓存、或明确依赖系统预装的 C 扩展(如某些发行版打包的 numpy)。绝大多数项目开发应保持默认隔离。
- 加了这个参数后,
pip list会同时显示系统包和虚拟环境内安装的包,但pip install --upgrade仍只影响虚拟环境内的副本 - 无法通过
pip uninstall卸载系统级包,强行操作会报错或损坏系统 Python - 如果你用
pyenv管理多版本 Python,--system-site-packages实际指向的是 pyenv 当前 shims 对应的 Python,不是系统原生 Python
退出和重建比“修复”更可靠
一旦发现 pip 不工作、python 版本不对、或 activate 后提示符没变,别花时间 debug,直接删掉整个目录重建。虚拟环境的设计哲学就是“可丢弃”——rm -rf .venv && python -m venv .venv 是最安全的兜底操作。
真正容易被忽略的是:**虚拟环境不能移动、不能复制、不能跨机器直接拷贝**。哪怕只是改个文件夹名(如 mv .venv myenv),再 source 也会失败,因为 pyvenv.cfg 里硬编码了原始路径。重命名必须用 python -m venv 新路径 重新生成。

















