2026-03-18 · 约 6 分钟 · Python

Python 虚拟环境管理:venv、pip 与依赖锁定的一点心得

Python工程实践

上周换电脑重装开发环境,一个小项目装依赖折腾了整整一个下午。原因很简单, 之前一直用系统 Python 顺手装包,没有留依赖清单,结果换机器就抓瞎。 这次把虚拟环境这套东西认真走了一遍,记下来。

一、为什么必须用虚拟环境

系统 Python 是给操作系统自己用的,有些发行版的系统工具(比如 apt、yum) 依赖特定版本的包。直接往里面 pip install 很容易把版本搞乱,严重时系统命令会直接报错。

虚拟环境做的事情很朴素:给每个项目一套独立的 site-packages 目录, 装包只影响当前项目。Python 3.3 起标准库自带 venv,一般不需要额外安装。

二、创建与激活

# 在项目根目录创建,目录名习惯用 .venv(会自动被多数工具忽略)
python3 -m venv .venv

# 激活(Linux / macOS)
source .venv/bin/activate

# 激活(Windows PowerShell)
.venv\Scripts\Activate.ps1

激活之后命令行前面会出现 (.venv) 前缀,此时 python 和 pip 都指向环境内的版本。退出直接执行 deactivate。

踩过的坑:Windows 下 PowerShell 默认禁止执行脚本,激活会报「禁止运行脚本」。

解决办法是给当前用户放开策略:Set-ExecutionPolicy -Scope CurrentUser RemoteSigned

三、依赖锁定:最关键的一步

环境跑起来只是第一步,能被别人(包括未来的自己)复现才算数。核心是把依赖版本固定下来:

# 安装
pip install requests pandas

# 导出当前环境的精确版本
pip freeze > requirements.txt

# 在新机器上一次性还原
pip install -r requirements.txt

requirements.txt 的三个常见坑

  • pip freeze 会导出所有包,包括你没直接安装、只是被依赖带进来的包。 这在锁定环境时是优点,但清单可读性差。想只留直接依赖,就自己维护一份精简清单, 再用 freeze 的完整版做复现。
  • 版本号是精确匹配。requests==2.31.0 表示只装这一个版本。 跨平台时偶尔会遇到某个版本在别的系统上没有预编译包,需要手工调整。
  • 不要把 .venv 目录提交进 Git。它体积大、路径写死在本机, 提交上去没有意义,记得加进 .gitignore。

四、我现在固定下来的习惯

  • 每个项目一个 .venv,激活后第一时间 pip install -U pip。
  • 装完包立刻 pip freeze > requirements.txt,随代码一起提交。
  • 项目根目录放 .gitignore,至少包含 .venv/、__pycache__/、*.pyc。
  • 换机器先建环境,再装依赖,最后才跑代码,顺序反了多半要返工。

这套流程不复杂,但确实省掉了后续的很多麻烦。写完这篇,下次再换机器应该能快不少。

← 返回归档 下一篇 →