为什么每个项目都要独立环境
全局 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