第2章:验证环境搭建——Python虚拟环境创建、依赖管理、版本控制工具选择
说实话,很多做算法验证的朋友,一开始都栽在环境搭建上。
我自己就吃过这个亏。刚入行那会儿,项目里同时跑着三个算法,每个依赖的Python版本都不一样。结果呢?装一个库,崩另一个库。折腾了两天,最后老老实实把环境全清了,从头搭虚拟环境。
嗯,这节课咱们就把这块彻底讲透。
2.1 为什么必须用虚拟环境?
你想想看,一个算法项目,可能依赖numpy 1.19,另一个项目需要numpy 1.24。如果全装到系统Python里,冲突是迟早的事。
虚拟环境说白了,就是给每个项目一个独立的“小房间”。房间里装什么库、什么版本,互不干扰。
核心原则:每个算法验证项目,都应该有自己独立的虚拟环境。
2.2 Python虚拟环境创建实战
我个人习惯用 venv,它是Python 3自带的,不需要额外安装。当然,如果你喜欢 conda 也可以,但咱们先从最轻量的开始。
2.2.1 使用 venv 创建环境
# 创建虚拟环境(在项目根目录下执行)
python -m venv venv
# 激活环境(Windows)
venv\Scripts\activate
# 激活环境(macOS/Linux)
source venv/bin/activate
激活后,你会看到命令行前面多了 (venv) 字样。这就说明你已经在虚拟环境里了。
小技巧:我一般把虚拟环境文件夹命名为 venv,并添加到 .gitignore 里。这样不会把环境本身提交到代码仓库。
2.2.2 使用 conda 创建环境(备选)
如果你做的是深度学习相关的算法验证,conda 会更方便。它不仅能管理Python包,还能管理CUDA、cuDNN这些底层依赖。
# 创建环境并指定Python版本
conda create -n algo_verify python=3.9
# 激活环境
conda activate algo_verify
我在项目中遇到过一个问题:用 venv 装PyTorch,死活装不上GPU版本。换成 conda 后,一行命令搞定。所以,选哪个工具,看你的具体场景。
2.3 依赖管理——别让“环境不一致”坑了你
环境搭好了,接下来就是装依赖。这里有个常见的坑:你本地跑得好好的,交给同事就报错。为什么?因为依赖版本不一样。
解决方案很简单:用 requirements.txt 锁定所有依赖版本。
2.3.1 生成 requirements.txt
# 导出当前环境的所有依赖及版本
pip freeze > requirements.txt
生成的文件长这样:
numpy==1.24.3
pandas==2.0.1
scikit-learn==1.2.2
matplotlib==3.7.1
2.3.2 从 requirements.txt 安装
# 在新环境中一键安装所有依赖
pip install -r requirements.txt
警告:我曾经因为没锁定版本,导致线上环境装了新版numpy,结果一个老算法直接报错。从那以后,我每次提交代码前都会更新 requirements.txt。
2.3.3 依赖分组管理(进阶)
有些依赖只在开发时用,比如 pytest、black。我习惯把它们分开:
# requirements-base.txt(核心依赖)
numpy==1.24.3
pandas==2.0.1
# requirements-dev.txt(开发依赖)
-r requirements-base.txt
pytest==7.4.0
black==23.3.0
这样,部署时只装 requirements-base.txt,开发时再装 requirements-dev.txt。
2.4 版本控制工具选择——Git 还是其他?
做算法验证,版本控制不只是管代码,还要管数据、模型、实验配置。我个人强烈推荐 Git,配合一些最佳实践,能省很多事。
2.4.1 Git 基础配置
# 初始化仓库
git init
# 创建 .gitignore 文件(忽略虚拟环境、缓存等)
echo "venv/" >> .gitignore
echo "__pycache__/" >> .gitignore
echo "*.pyc" >> .gitignore
2.4.2 分支策略建议
对于算法验证项目,我建议用简单的分支策略:
| 分支 | 用途 |
|---|---|
main |
稳定版本,通过验证的代码 |
dev |
日常开发,算法调试 |
feature/xxx |
新算法或新功能实验 |
我在项目中遇到过这种情况:在 main 上直接改代码,结果改崩了,回退都麻烦。后来强制要求所有改动先走 feature 分支,合并前必须 review。嗯,从此清净多了。
2.4.3 版本号规范
每次验证通过后,打个 tag 标记版本:
# 语义化版本号:主版本.次版本.修订号
git tag v1.0.0
git push origin v1.0.0
这样,哪天发现新版本有问题,可以快速切回旧版本对比。
2.5 知识体系总览
下面这张图,概括了本章的核心逻辑:
2.6 避坑指南
最后,分享几个我踩过的坑:
- 不要在系统Python里装包。 我曾经图省事,直接在系统环境里装了个库,结果把系统自带的工具搞坏了。重装系统?不存在的,老老实实重配环境。
- requirements.txt 要手动检查。
pip freeze会导出所有依赖,包括一些隐式依赖。我建议只保留你直接引用的库,去掉那些自动带进来的。 - Git 提交前先更新 requirements.txt。 我定了个规矩:每次提交代码前,先跑一遍
pip freeze更新依赖文件。这样别人拉下来直接就能跑。
我的习惯:每个算法验证项目,我都会在根目录放一个 setup.sh 脚本,里面包含创建环境、安装依赖、初始化Git的全部命令。新同事加入,跑一遍这个脚本,环境就搭好了。
好了,环境搭建这块就讲到这里。说白了,就是三个词:隔离、锁定、追溯。把这三点做到位,你的算法验证之路会顺畅很多。