编程语言

Python 虚拟环境实战:venv 创建、依赖锁定与跨平台坑

「在我机器上能跑」大多源于环境混用。本文用标准库 venv 搭建干净流程:创建、激活、依赖固定与复现,并点名 Windows 激活、版本漂移、跨平台依赖这三类高频坑。

作者:巧匠团队·8 分钟阅读·更新于 2026-08-30

为什么每个项目都要独立环境

全局 site-packages 是所有项目共享的:项目 A 升级了 requests 到 2.32,项目 B 就地崩掉——这就是「昨天还好好的」的真相。虚拟环境给每个项目一套隔离的 site-packages 与独立的 python/pip 入口,互不干扰,删除即整体销毁,是最朴素的依赖治理。

python -m venv .venv        # 在项目根目录创建(建议固定叫 .venv)

激活与退出:记平台差异,别记死命令

Linux/macOS 用 `source .venv/bin/activate`;Windows PowerShell 是 `.venv\Scripts\Activate.ps1`,cmd 是 `Scripts\activate.bat`。退出统一是 `deactivate`。PowerShell 首次报「禁止运行脚本」是执行策略限制,`Set-ExecutionPolicy -Scope CurrentUser RemoteSigned` 一次性解决。

VSCode/PyCharm 里把解释器指到 .venv 内的 python,终端会自动激活,日常几乎不用手动敲这些命令——这是省心的做法。

source .venv/bin/activate          # Linux / macOS
.venv\Scripts\Activate.ps1         # Windows PowerShell
deactivate                         # 退出虚拟环境

依赖固定:requirements.txt 的三档写法

① 宽松(`requests`):装到什么全看运气,适合原型;② 区间(`requests>=2.28,<3`):常用折中;③ 精确锁定(`requests==2.32.3`):部署可复现,`pip freeze > requirements.txt` 生成的就是这档。实践建议:开发用区间版本表达意图,发布时 freeze 出一份精确锁文件用于部署,两层各司其职。

直接提交 freeze 结果作为唯一依赖文件的问题是:跨平台依赖会带进来平台专属包名(如 Windows 的 colorama、Linux 的 furo),队友在另一平台安装直接报错——这类包应拆到单独文件或加环境标记。

requests>=2.28,<3        # 区间:表达意图
pip freeze > requirements.txt   # 锁定:可复现部署
# 跨平台标记示例:
colorama; sys_platform == "win32"

三个高频翻车点

① 用错解释器创建环境:系统里多个 python 时,`python -m venv` 用的可能是旧版本——先 `python --version` 确认,或显式 `python3.12 -m venv .venv`;② 环境目录被移动/重命名后路径失效:venv 内的脚本硬编码了绝对路径,搬家后删掉重建最省事;③ IDE 在跑的不是 .venv:命令行正常、IDE 报 ModuleNotFoundError,八成是解释器没指向虚拟环境。

python --version            # 先确认解释器
python3.12 -m venv .venv    # 必要时显式指定版本
which python                # 激活后应指向 .venv 内的 python

何时升级到 uv / poetry

标准库 venv + pip 覆盖单项目需求已经够用。当出现这些信号再考虑工具升级:依赖解析频繁冲突、需要 lockfile 的可复现构建(pip-tools 是轻量选项)、需要打包发布到 PyPI(poetry/hatch)、追求极速安装与 Python 版本管理(uv)。先会用标准工具,再让工具解决真实痛点,顺序反了只会多背一层概念。

pip install pip-tools
pip-compile requirements.in    # 生成带锁定的 requirements.txt

一页速查:venv 工作流

创建 `python -m venv .venv` → 激活(按平台选命令)→ 装包 `pip install` → 开发期区间版本 → 发布期 `pip freeze` 锁定 → .venv 进 .gitignore,requirements.txt 进仓库。六步走完,环境问题从此与你无关。

python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
echo ".venv/" >> .gitignore