Python 项目做依赖隔离,virtualenv 仍然是绕不开的基础工具。21.4.3 这个小版本没有大刀阔斧的重构,但两处改动值得留意:嵌入式 pip、setuptools、wheel 跟着上游一起升了版本,CI 流程里那些可避免的检查通知也被静默处理掉了。对日常开发来说,这意味着新建虚拟环境时拿到的包版本更新、CI 日志更干净。
嵌入式工具链为什么重要
virtualenv 创建环境时并不依赖系统已有的 pip——它自带了一份嵌入式的 pip、setuptools 和 wheel,直接拷进新环境里。这样做的好处是:哪怕宿主机连 pip 都没装,virtualenv myenv 依然能跑通,新环境立刻就能用 pip install 安装包。
问题也随之而来:嵌入式版本如果长期不更新,新环境里的 pip 可能是几个月前的旧版,缺少安全补丁或性能改进。21.4.3 把这三件套同步到了上游最新稳定版,新建环境时不再需要手动 pip install --upgrade pip 补一刀。
CI 通知静默处理
另一个改动是 CI 相关的:#3154 把「可避免的检查工作流通知」做了静默处理。跑 CI 时,有些检查通知对开发者来说是噪音——比如某些 lint 规则的 warning 在特定场景下是预期行为,每次都弹通知只会分散注意力。静默处理后,真正需要关注的失败信号反而更醒目。
如果你在自己的项目 CI 里也遇到过类似问题,可以参考这个思路:对已知可忽略的检查项加 continue-on-error 或在 workflow 配置里过滤通知级别,而不是让噪音淹没关键报错。
实操:升级与新建环境
如果你已经在用 virtualenv,升级到 21.4.3 只需一行:
pip install --upgrade virtualenv==21.4.3
升级后新建一个环境,验证嵌入式工具链版本:
virtualenv demo-env
source demo-env/bin/activate
pip --version
setuptools --version # 如果 setuptools 有 CLI 入口
python -c "import wheel; print(wheel.__version__)"
如果项目用 pyproject.toml 管理依赖,可以配合 virtualenv 快速搭建隔离测试环境:
virtualenv test-env
source test-env/bin/activate
pip install -e . # 安装当前项目(可编辑模式)
pip install pytest
pytest tests/
生产部署场景下,打包整个虚拟环境目录到目标服务器也是 virtualenv 的经典用法——环境里已经包含了指定版本的 pip 和所有依赖,服务器上不需要再执行任何安装命令:
# 开发机上
virtualenv --python=3.11 prod-env
source prod-env/bin/activate
pip install -r requirements.txt
# 打包并传输
tar czf prod-env.tar.gz prod-env/
scp prod-env.tar.gz deploy-server:/opt/app/
# 服务器上
cd /opt/app && tar xzf prod-env.tar.gz
source prod-env/bin/activate
python app.py
注意:跨平台打包(比如从 macOS 打到 Linux)可能因二进制不兼容而失败,同架构同操作系统才稳妥。
日常使用建议
- 定期升级 virtualenv 本身:嵌入式工具链的版本跟着 virtualenv 走,不升级就永远用旧版 pip 创建新环境。
- 与 venv 的取舍:Python 3.3+ 自带
venv模块,功能类似但不嵌入 pip,需要宿主机已有 pip 或额外安装。如果你需要完全自包含的环境,virtualenv 仍是更可靠的选择。 - CI 里过滤噪音:借鉴 21.4.3 的做法,在自己的 GitHub Actions 或其他 CI 配置里,把已知可忽略的通知静默掉,让失败信号更清晰。
- 锁定版本部署:生产环境打包时,
requirements.txt里用==锁定版本号,配合 virtualenv 的自包含特性,部署就变成纯粹的文件拷贝,不再依赖服务器上的包管理。