学 Python 的人几乎都会踩这两个坑:
- 依赖冲突:A 项目要
numpy==1.20,B 项目要numpy==1.25,两个项目一起装到系统 Python 里,A 用起来 B 就崩; - 环境污染:随手
pip install装了 100 多个包,之后不知道哪个是哪个项目要的,也不敢删。
答案就是 虚拟环境(venv)——每个项目一个独立的 Python 依赖沙箱。配合 pip,你能优雅地管理任意多个项目的依赖。这一篇讲透 pip、venv、requirements.txt、pyproject.toml,以及现代化的替代品(uv、poetry)。
一、pip 是什么
pip 是 Python 官方推荐的包管理工具,用来安装、升级、卸载第三方库。Python 3.4+ 自带 pip。
1 | pip --version |
二、pip 常用命令
安装 / 卸载 / 升级
1 | pip install requests # 装最新版 |
查询
1 | pip list # 已安装的包 |
换源
pip 默认从 PyPI 下载,国内速度慢。换成清华源:
1 | # 一次性 |
三、为什么需要虚拟环境
没有虚拟环境的世界:
1 | pip install django==3.2 # 项目 A 用 |
系统只有一个 Python,装到里面就冲突。
有虚拟环境的世界:
1 | 项目 A/.venv/ ← django 3.2 |
每个项目独立,互不干扰。
四、venv:官方虚拟环境工具
Python 3.3+ 自带 venv,无需安装。
创建
在项目根目录:
1 | # Windows |
会创建一个 .venv/ 目录,里面装着一份独立的 Python 解释器和标准库链接。
激活
激活后当前 shell 的 python/pip 都指向这个虚拟环境:
1 | # Windows PowerShell / cmd |
激活后命令提示符前会多出 (.venv):
1 | (.venv) $ pip install requests |
退出
1 | deactivate |
删除虚拟环境
直接删掉整个 .venv/ 目录即可,没有其他”注册”要清理。
五、requirements.txt:项目依赖清单
记录依赖:
1 | pip freeze > requirements.txt |
生成的文件类似:
1 | certifi==2024.2.2 |
恢复依赖(在别人的电脑或另一个虚拟环境):
1 | pip install -r requirements.txt |
freeze 的问题
pip freeze 把间接依赖(依赖的依赖)也列了出来,太啰嗦。更规范的做法:
- 顶层依赖写在
requirements.txt(只写你直接用的); - 锁定所有版本写在
requirements-lock.txt(由 pip freeze 或 pip-tools 生成,用来重现环境)。
或者用现代工具 pip-tools:
1 | pip install pip-tools |
六、pyproject.toml:现代项目配置
requirements.txt 太朴素,现代 Python 用 pyproject.toml 一站式描述项目:
1 | [project] |
然后:
1 | pip install -e . # 装项目本身 |
七、常用第三方工具
uv(Rust 写的极速 pip 替代品,2024 起流行)
1 | pip install uv |
poetry
以前很火的项目管理器,功能全但配置繁琐。新人可以先跳过。
conda(Anaconda)
科学计算/AI 生态用得多,能装 non-Python 依赖(C 库、CUDA 等)。用 conda 就别混用 pip,容易乱。
八、pipx:全局安装 CLI 工具
有些命令行工具(black、ruff、ipython、awscli)你希望全局可用但独立环境:
1 | pipx install black |
pipx 会为每个工具建一个隐藏虚拟环境,暴露一个命令,互不干扰。
九、依赖版本约束语法
1 | requests # 任意版本 |
~= 是语义化版本的推荐写法——允许”补丁号”升级,禁止”次版本号”变化。
十、常见工作流
新项目
1 | mkdir myproject && cd myproject |
别人的项目
1 | git clone <url> |
IDE 里挑选解释器
- VS Code:
Ctrl+Shift+P→ “Python: Select Interpreter” → 选.venv/bin/python; - PyCharm:Settings → Python Interpreter → Add → Existing Environment。
十一、.gitignore 里加什么
永远不要把虚拟环境目录、缓存、编译产物提交进 git:
1 | .venv/ |
十二、镜像源与私有源
全局设置镜像
1 | # Linux/macOS: ~/.pip/pip.conf |
项目级镜像
在项目根目录放 pip.conf,只在这个项目里生效。
私有 PyPI(企业内网)
1 | pip install --extra-index-url https://pypi.company.com/simple mypkg |
十三、依赖冲突诊断
pip install 有时候会报 “cannot resolve dependencies” 或者装完运行时报导入错误。诊断步骤:
pip list查看已装的版本;pip show <包名>查看依赖关系;pip check让 pip 检查依赖冲突;- 用
pipdeptree看依赖树:
1 | pip install pipdeptree |
十四、一个完整例子:搭建 Web 项目
1 | # 1. 建立虚拟环境 |
一个新同事拿到你的仓库,只需要:
1 | git clone <repo> && cd myweb |
就能跑起来。
十五、常见陷阱
- 忘记激活虚拟环境:
pip install装到系统 Python 了。永远看命令提示符前是否有(.venv)。 - 多个 Python 版本共存:
pip有时装到别的 Python 上。用python -m pip install ...强制绑定到当前 python。 - 在 requirements.txt 里锁到过旧版本:不主动升级容易积累技术债,也可能有安全漏洞。定期
pip list --outdated检查。 - 虚拟环境跨机器复制:
.venv/有硬编码路径,不能复制到别的电脑。永远靠 requirements.txt 重建。 - conda 和 pip 混用:容易乱。选一个坚持用。
- 用 sudo pip install:Linux 上千万别 sudo,会污染系统 Python。永远用虚拟环境。
十六、小结与延伸阅读
- 每个项目一个虚拟环境,永远不要污染系统 Python;
python -m venv .venv创建,source .venv/bin/activate激活;pip install、pip freeze、pip install -r requirements.txt三剑客;- 用
pyproject.toml描述项目; - 想更快用
uv,想更完善用poetry; - CLI 工具用
pipx; - 别把
.venv/提交进 git。
延伸阅读:
- venv 官方文档:https://docs.python.org/zh-cn/3/library/venv.html
- Python Packaging User Guide:https://packaging.python.org/
- uv 项目主页:https://github.com/astral-sh/uv
到这里模块三(函数与模块)7 篇结束! 下一篇进入 模块四:面向对象编程,从 类与对象基础 开始。