系列文章

Python 从入门到精通

第 23 / 36 篇

从环境安装和基础语法出发,逐步学习工程实践、自动化、数据处理与 Web 开发。

  1. 01
    Python 怎么装、怎么用
  2. 02
    变量、数字和字符串
  3. 03
    列表:把一组数据放在一起
  4. 04
    元组、集合和字典
  5. 05
    条件判断:让程序做选择
  6. 06
    循环:重复的事交给程序
  7. 07
    函数:把代码整理成可复用的块
  8. 08
    模块与包:拆分你的程序
  9. 09
    输入、输出与字符串格式化
  10. 10
    文件读写:保存程序的数据
  11. 11
    异常处理:程序出错时怎么办
  12. 12
    基础阶段练习:命令行记账本
  13. 13
    类和对象:面向对象入门
  14. 14
    继承、组合与特殊方法
  15. 15
    迭代器与生成器
  16. 16
    列表推导式与生成器表达式
  17. 17
    装饰器:给函数增加能力
  18. 18
    上下文管理器与 with
  19. 19
    类型标注与 dataclass
  20. 20
    正则表达式:从文本中找规律
  21. 21
    日期、时间与时区
  22. 22
    日志与调试
  23. 23
    虚拟环境与依赖管理正在阅读
  24. 24
    测试:让修改不再提心吊胆
  25. 25
    网络请求:用 Python 调用 API
  26. 26
    网页解析与合规采集
  27. 27
    操作 Excel、CSV 与批量文件
  28. 28
    SQLite:给程序加一个数据库
  29. 29
    数据分析入门:NumPy 与 Pandas
  30. 30
    画图:把数据变得直观
  31. 31
    Flask 入门:做一个小网站
  32. 32
    异步编程:同时处理多项任务
  33. 33
    线程、进程与并发选择
  34. 34
    性能分析与优化
  35. 35
    项目结构、配置与发布
  36. 36
    综合项目:从需求到上线

查看整个系列 →

你已经装了 requests、beautifulsoup4 这些第三方库。但你有没有遇到过:项目 A 需要 requests 2.x,项目 B 需要 requests 3.x,装来装去全乱了?这就是”依赖冲突”。解决办法是虚拟环境(virtual environment):每个项目一个独立的小环境,互不干扰。这一篇把它和依赖管理讲透。

为什么需要虚拟环境

不加虚拟环境的痛:

  • pip install 装到全局,所有项目共用一份
  • 项目 A 升级库版本,项目 B 突然跑不起来
  • 卸载时不知道哪些是哪个项目用的
  • 权限问题:系统 Python 目录经常没权限写

虚拟环境 = 给每个项目一个独立的 Python 环境,自己的包自己装,互不干扰。这是专业开发的标配,不是可选项。

创建和激活

用内置的 venv 模块(Python 3.3+,不用额外装):

# 1. 在项目目录创建虚拟环境(名字随意,惯例叫 venv 或 .venv)
cd myproject
python -m venv venv

# 2. 激活(每次开新终端都要激活一次)
# Windows(cmd / PowerShell)
venvScriptsactivate
# macOS / Linux
source venv/bin/activate

# 3. 激活后命令行提示符前面会出现 (venv)
(venv) $ pip install requests

# 4. 干完活退出
deactivate

激活后 pip install 装的东西都在这个虚拟环境里,和全局完全隔离。检查是否生效:

(venv) $ which python
# /Users/you/myproject/venv/bin/python   ← 指向项目里的 python,而不是系统的

pip 的日常操作

# 安装
pip install requests
pip install requests==2.31.0        # 指定版本
pip install "requests>=2.20, <3"   # 版本范围
pip install -r requirements.txt      # 按清单批量装

# 查看
pip list                             # 已安装的包
pip show requests                    # 某个包的详情

# 卸载
pip uninstall requests

# 升级
pip install --upgrade pip

requirements.txt:依赖清单

项目要给别人跑(或者三个月后的自己),得把依赖写清楚。标准做法:

# 生成当前环境的依赖清单(含版本号)
pip freeze > requirements.txt

生成的 requirements.txt 长这样:

beautifulsoup4==4.12.3
requests==2.31.0
flask==3.0.2

别人拿到项目:

pip install -r requirements.txt

注意事项:

  • pip freeze 会把所有间接依赖也列出来,可能很啰嗦;也可以用 pipreqs 只列项目真正 import 的
  • requirements.txt 要提交进 git,虚拟环境目录(venv/)不要提交
  • 版本号锁死(==)保证可复现,但升级时要手动更新

国内换源:下载快 10 倍

pip 默认走国外 PyPI,国内经常慢到超时。换国内镜像源:

# 临时指定
pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple

# 永久配置(推荐)
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

# 其他常用源
# 阿里:https://mirrors.aliyun.com/pypi/simple/
# 腾讯:https://mirrors.cloud.tencent.com/pypi/simple/
# 豆瓣:https://pypi.douban.com/simple/

版本冲突的实战处理

装包时报这种错:

ERROR: pip's dependency resolver does not currently take into account all the packages...
requests 2.31.0 requires urllib3<3, but you have urllib3 3.0.0

意思是:requests 要求 urllib3 小于 3,你装的是 3.x。处理套路:

# 1. 让 pip 自己解决(先试试)
pip install requests --upgrade

# 2. 指定兼容版本
pip install "urllib3<3"

# 3. 查依赖关系
pip show requests          # 看它依赖什么
pip check                  # 检查当前环境有没有冲突

# 4. 实在乱套了,重建虚拟环境(最干净)
deactivate
rm -rf venv
python -m venv venv
pip install -r requirements.txt

记住:环境乱到没法收拾,删了重建永远是最快的——这也是虚拟环境最大的好处,全局环境你不敢删。

新手坑

坑 1:忘了激活。终端里 pip install 装到全局去了,项目里 import 不到,或者装到”另一个 Python”里。每次开终端先看提示符有没有 (venv)。

坑 2:python 和 pip 版本对不上。系统里有多个 Python 时,用 python -m pip install xxx 代替 pip install xxx,保证装到当前 python 的环境里。

坑 3:把 venv 目录提交进 git。venv 里有几万个文件,谁 clone 谁崩溃。写进 .gitignore。

小结

  • 虚拟环境 = 项目独立的 Python 环境,解决依赖冲突
  • python -m venv venv 创建,source venv/bin/activate(Linux/mac)激活,deactivate 退出
  • pip freeze > requirements.txt 导出,pip install -r requirements.txt 还原
  • 国内 pip 换清华/阿里源,速度立竿见影
  • 环境乱了就删了重建,别硬修;venv 别提交进 git

练习

  1. 给之前写的记账本项目创建虚拟环境,装上项目需要的包(如果有),导出 requirements.txt
  2. 把 pip 永久换成清华源,然后安装一个包验证速度
  3. 思考:为什么 requirements.txt 要锁版本号(==)?如果写 requests 不带版本,别人安装时会有什么风险?