Python 虚拟环境避坑:venv、conda 与 uv 怎么选
几乎每个 Python 开发者都被虚拟环境坑过:明明 pip install 成功了,运行却报 ModuleNotFoundError;换一台电脑,项目死活跑不起来;两个项目依赖版本互相打架,升级一个、崩掉另一个。这些问题大多不是代码的错,而是环境没管好。今天就聊聊 venv、conda、uv 这三位选手,帮你选对工具、避开常见的坑。
一、为什么一定要用虚拟环境
Python 默认把第三方包都装到全局的 site-packages 里。A 项目要 requests 2.x,B 项目要 requests 1.x,全局只能留一个版本,迟早打架。更糟的是,系统自带的 Python 一旦被乱装包污染,重装系统级的 Python 会牵连一大片工具。虚拟环境的本质,就是给每个项目一个独立、干净的“包抽屉”,互不干扰。
二、venv:官方标配,轻量够用
venv 从 Python 3.3 起内置,不用额外安装,是最稳妥的起点:
python -m venv .venv
source .venv/bin/activate # Windows 用 .venv\Scripts\activate
pip install -r requirements.txt
常见坑有三个:第一,忘记激活就在全局装包,事后才发现装错了地方;第二,把 .venv 目录提交进 Git,仓库瞬间膨胀几百兆,记得写进 .gitignore;第三,升级系统 Python 后旧环境可能失效,需要重建。venv 适合纯 Python 项目、教学和小工具,配合 pip freeze > requirements.txt 锁定版本,简单可靠。
三、conda:数据科学的重型武器
conda 不只是 Python 的包管理器,还能安装非 Python 的依赖,比如 CUDA、MKL、GDAL,数据科学领域几乎是标配:
conda create -n ml python=3.12
conda activate ml
conda install numpy pandas scikit-learn
它的坑也不少:安装时默认激活 base 环境,容易在不知不觉中往 base 里装东西;conda 与 pip 混用是重灾区,两种工具各自解析依赖,装出来的环境可能互相覆盖;channel 优先级配错还会装到旧版本。建议用 environment.yml 记录环境,优先用 conda 装,实在没有的包再用 pip 补装,并把这条规则写进团队文档。
四、uv:又快又新的搅局者
uv 是用 Rust 写的 Python 包管理工具,安装和解析依赖的速度比 pip 快一个数量级,正在成为很多新项目的首选:
uv init my-project
uv add requests
uv run python main.py
uv 会生成 uv.lock,把依赖版本精确锁定,团队成员用 uv sync 就能复现一模一样的环境。它的坑主要在“新”:命令和 pip 不完全对应,需要一点学习成本;国内网络环境下要配好镜像源;老项目从 requirements.txt 迁移时要先验证一遍再切换。适合新项目、追求效率的团队和 CI 提速。
五、三者怎么选
| 维度 | venv | conda | uv |
|---|---|---|---|
| 安装成本 | 零,内置 | 需安装 Miniforge/Anaconda | 需安装,但极轻 |
| 速度 | 一般 | 较慢 | 极快 |
| 非 Python 依赖 | 不支持 | 强项 | 不支持 |
| 锁定文件 | requirements.txt | environment.yml | uv.lock |
| 适合场景 | 通用、教学 | 数据科学、机器学习 | 新项目、工程化 |
一句话建议:新手和轻量项目用 venv;做数据分析、机器学习选 conda(推荐 Miniforge);新项目想一步到位,直接上 uv。
六、通用避坑清单
- 一个项目一个环境,绝不在全局装项目依赖。
- 装包前先确认环境已激活,养成看命令行前缀的习惯。
- 一定要锁定版本,提交 requirements.txt、environment.yml 或 uv.lock。
- 不要混用 pip 和 conda,除非你清楚自己在做什么。
- .venv、pycache 写进 .gitignore,定期清理长期不用的环境。
环境管理没有银弹,只有适合当前项目的选择。先把手头的项目挪进虚拟环境,再按场景挑工具,踩过的坑就不会再踩第二遍。
- 点赞
- 收藏
- 关注作者
评论(0)