venv是Python 3.3+内置模块,无需pip安装,直接用python -m venv创建;virtualenv是第三方工具,须先pip install virtualenv。venv绑定调用解释器版本,不支持-p参数;virtualenv支持-virtualenv -p python3.x指定解释器。

venv 是 Python 3.3+ 内置模块,virtualenv 是第三方工具
venv 不需要 pip install,只要你的 Python 是 3.3 或更新版本(比如当前主流的 3.9–3.12),直接调用 python -m venv 就能创建环境。virtualenv 则必须先执行 pip install virtualenv,否则命令 virtualenv 找不到。
常见错误现象:'virtualenv' is not recognized as an internal or external command —— 这说明你没装,或者装在了非默认 Python 环境里(比如用 conda 装的 pip 却在系统 Python 下运行)。
使用场景差异:
- 新项目、纯 Python 3.x 开发 → 优先用
venv - 要兼容 Python 2.7 的遗留项目 → 只能用
virtualenv - CI/CD 流水线中强调最小依赖 →
venv更干净(没额外 pip 包干扰)
创建时指定 Python 版本的方式完全不同
venv 严格绑定调用它的解释器:运行 python3.11 -m venv myenv,创建出来的环境就固定用 3.11;运行 python3.8 -m venv myenv,就是 3.8。它不支持“用 3.8 创建、再换 3.11 运行”这种切换。
virtualenv 支持显式指定解释器路径:virtualenv -p python3.11 myenv,甚至能指向 WSL 或 Miniconda 下的任意 python 可执行文件。
容易踩的坑:
Python venv 3.14.2 使用 Python 3.14.2 Windows 64 位官方安装包,安装 Python 后即可使用标准库 venv 创建虚拟环境。
- 误以为
venv有-p参数 → 实际没有,会报错unrecognized arguments: -p - 在多 Python 版本共存的 Windows 上,
python命令可能指向旧版本,导致python -m venv创建出错的环境 - 想复用已有虚拟环境但换 Python 版本?
venv必须删掉重建;virtualenv也一样,但至少提示更明确
激活脚本和目录结构基本一致,但 PowerShell 默认被禁用
两者都生成 Scripts\activate.bat(CMD)和 Scripts\Activate.ps1(PowerShell)。但 Windows 默认禁止运行未签名的 PowerShell 脚本,所以直接运行 Scripts\Activate.ps1 会失败,报错:File Activate.ps1 cannot be loaded because running scripts is disabled on this system.
解决方式统一:
- CMD 下用
venv\Scripts\activate.bat(或简写venv\Scripts\activate) - PowerShell 下先临时放宽策略:
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser,再运行venv\Scripts\Activate.ps1 - VS Code 集成终端默认用 PowerShell,这点尤其容易卡住新手
注意:virtualenv 生成的 Activate.ps1 和 venv 完全等效,不存在功能差异,只是签名状态一样。
要不要装 virtualenv,取决于你是否需要它的扩展能力
venv 满足 90% 的日常需求:隔离包、避免污染全局 site-packages、导出 requirements.txt。但如果你遇到这些情况,virtualenv 仍不可替代:
- 需要
--relocatable(把环境打包移动到另一台机器,虽已不推荐) - CI 中需强制跳过 pip 升级(
virtualenv --no-pip) - 配合
tox测试多版本兼容性时,virtualenv的插件生态更成熟 - 某些老企业内网镜像源只适配
virtualenv的初始化逻辑
性能上,venv 启动略快(Python 3.9+ 实测快 15–20%),因为少一层 pip 包加载;但创建耗时几乎无差别,都是秒级。
真正复杂的是环境迁移和跨平台协作——venv 生成的 pyvenv.cfg 里硬编码了绝对路径,复制到另一台机器大概率失效;virtualenv 同样如此。别指望直接拷贝整个 venv 文件夹就能用,这是最常被忽略的实操盲点。

















