依赖管理与第三方库
标准库管的是"通用到人人都需要"的那部分需求,但你手头的具体工作——调一个大模型接口、解析一种冷门数据格式、画一张统计图——大概率早就有人写成库挂到网上了。Python 最厚的护城河就是这片第三方生态,而用好它靠三样基本…
标准库管的是"通用到人人都需要"的那部分需求,但你手头的具体工作——调一个大模型接口、解析一种冷门数据格式、画一张统计图——大概率早就有人写成库挂到网上了。Python 最厚的护城河就是这片第三方生态,而用好它靠三样基本功:pip 装包、requirements.txt 记账、venv 隔离。这一章把三样一次配齐,做完作业你会得到一个真正"工程化"的项目骨架。
1. pip 与 PyPI:生态的入口
PyPI(Python Package Index)是官方包仓库,全世界的开发者往上面发布作品;pip 是从仓库取货的工具,从 Python 3.4 起随解释器一起安装,开箱即用:
pip --version # 看看版本,顺便确认它可用
pip help # 全部子命令的说明书
一个常见坑:机器上装了多个 Python 时,裸敲 pip 到底服务哪一个说不清。两种保险写法——改用 pip3,或者干脆借当前解释器之手:
python -m pip install 包名 # 谁的 python,就装给谁
2. 安装第三方库
2.1 最朴素的装法
pip install requests # HTTP 请求库
pip install rich # 终端美化输出
2.2 把版本攥在手里
生产环境最怕"昨天还好好的,今天一升级就崩了"。装包时顺手加上版本约束:
pip install requests==2.31.0 # 钉死某个版本
pip install "requests>=2.20" # 设个下限
pip install "requests>=2.20,<3.0" # 圈定一个区间
完整的约束符号一览:
| 符号 | 含义 |
|---|---|
== |
钉死指定版本 |
>= |
下限(含) |
> |
严格大于 |
<= |
上限(含) |
< |
严格小于 |
~= |
锁住主次版本,只放开补丁号 |
!= |
排除某个版本 |
, |
组合多个条件 |
* |
通配任意版本 |
2.3 一条命令装一串
pip install requests rich python-dotenv
3. 升级与卸载
pip install --upgrade requests # 升到最新,可简写成 -U
pip install -U pip # 给 pip 自己升级
pip uninstall requests # 卸载(会先问一句确认)
pip uninstall -y requests rich # -y 跳过确认,可连卸多个
4. 摸清环境里装了什么
pip list # 当前环境里的全部包
pip list --outdated # 哪些包有新版本可升
pip show requests # 单个包的详细档案
pip show 的典型输出长这样:
Name: requests
Version: 2.31.0
Summary: Python HTTP for Humans.
Requires: certifi, charset-normalizer, idna, urllib3
Required-by:
重点盯最后两行:Requires 是它依赖谁,Required-by 是谁依赖它——排查依赖冲突时全靠这两行。
5. 国内镜像加速
PyPI 服务器在境外,直连下载有时慢得让人怀疑人生。国内高校和企业维护了一批镜像站,内容与官方保持同步:
| 镜像 | 地址 |
|---|---|
| 清华大学 | https://pypi.tuna.tsinghua.edu.cn/simple/ |
| 阿里云 | https://mirrors.aliyun.com/pypi/simple/ |
| 中国科技大学 | https://pypi.mirrors.ustc.edu.cn/simple/ |
| 华为云 | https://repo.huaweicloud.com/repository/pypi/simple/ |
临时借用一次(只对当条命令生效):
pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple/
设为默认(写进 pip 的全局配置):
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple/
6. requirements.txt:把依赖交给文件管
项目换台机器、换个同事接手,怎么保证环境里装的包一模一样?答案是让文件替你记账。约定俗成的文件名是 requirements.txt:
requests>=2.31.0
python-dotenv>=1.0.0
rich==13.7.0
两条核心命令:
pip freeze > requirements.txt # 把当前环境冻成一份清单
pip install -r requirements.txt # 照着清单原样复刻环境
注意 freeze 导出的是当前环境的全部包(连依赖的依赖都在),适合"精确复刻"场景;如果你维护的是要给别人用的库,通常手写直接依赖即可,不必事无巨细。
7. 虚拟环境 venv:一个项目一间储物间
7.1 为什么需要隔离
A 项目要用 requests 2.20,B 项目非要 requests 2.31——同一个全局环境里,两个版本装不下,谁后装谁覆盖。虚拟环境的思路很直白:给每个项目单独配一套 site-packages,互不打扰。
7.2 三步上手
# 1. 在项目目录里创建虚拟环境(会生成一个 .venv 目录)
python -m venv .venv
# 2. 激活(macOS / Linux)
source .venv/bin/activate
# 2. 激活(Windows)
.venv\Scripts\activate
# 3. 激活后再装包,东西只进这个项目的储物间
pip install requests
# 用完退出,回到全局环境
deactivate
激活成功的标志:命令行提示符前面多出 (.venv) 字样。
7.3 标准工作流
python -m venv .venv # ① 建环境
source .venv/bin/activate # ② 进环境
pip install -r requirements.txt # ③ 照单安装
# ……安心开发……
pip freeze > requirements.txt # ④ 收工前更新清单
deactivate # ⑤ 退环境
两个冷知识:
python -m venv里的-m表示"按模块方式运行"——解释器会沿着第 15 章讲的模块搜索路径找到venv再执行它venv的前身是第三方库virtualenv;Python 3.3 起官方把它的核心能力精简后收编进标准库,从此不必额外安装
8. 作业
老规矩:先自己写,卡住了再让 AI 打下手,以亲手跑通为准。
习题一:终端 AI 聊天助手
做一个能在命令行里和 AI 大模型连续对话的工具,要求:
- 接口地址、模型名、密钥都从
.env读取——密钥绝不能写死在代码里 - 支持多轮对话:把历史消息一路带上,模型才"记得"前面聊过什么
- 回复按流式输出逐小段打印,而不是憋到最后一次性吐出
提示:HTTP 请求用 requests,读配置用 python-dotenv,依赖记录进 requirements.txt,开发全程在虚拟环境里进行——正好把本章内容串一遍。
下一章:18 · 线程与进程