上周换电脑重装开发环境,一个小项目装依赖折腾了整整一个下午。原因很简单, 之前一直用系统 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。 - 换机器先建环境,再装依赖,最后才跑代码,顺序反了多半要返工。
这套流程不复杂,但确实省掉了后续的很多麻烦。写完这篇,下次再换机器应该能快不少。