虚拟环境与第三方模块管理
默认情况下,当我们直接使用pip进行第三方模块安装时,Python会将第三方包放入一个全局的site-packages目录中,直接使用系统或用户主目录下的 Python 解释器环境;我们可以使用 python -m site查看所有site-packages的列表。
那么使用全局环境管理是不是就足够了?它有什么优缺点呢?
优点:
尽管不被推荐,但全局环境在某些特定场景下确实有其优势
操作简便、学习曲线低:
无需理解“激活”、“路径切换”等概念。对于刚刚接触 Python 的初学者,直接
pip install即可运行代码,门槛最低;对于学习阶段我觉得这个是最主要的原因。节省磁盘空间:
包只安装一次。如果有 10 个项目都用到
numpy,全局安装只需占用一份空间(约 100-200MB),而每个项目都开虚拟环境则会占用 1-2GB。减少环境配置时间:
对于一次性的、临时性的脚本编写,跳过环境创建步骤可以快速进入开发状态。
缺点:
依赖版本冲突(最致命问题)
场景:项目 A 依赖
pandas 1.0,项目 B 因为需要新功能必须使用pandas 2.0后果:由于全局只能存在一个版本,安装 B 的依赖会直接覆盖 A 的依赖,导致项目 A 无法运行
系统稳定性风险(Linux/macOS)
风险:许多操作系统(如 Ubuntu, Fedora)本身的部分管理工具是基于 Python 编写的
后果:如果你使用
sudo pip install升级了系统自带的某个库,可能会导致系统自带的软件管理器(如apt)或显示管理器崩溃,修复代价极高环境污染与难以迁移
污染:随着时间推移,全局
site-packages会积累成百上千个包。你很难分清哪些是正在用的,哪些是几个月前测试后遗忘的迁移难:当你需要把项目部署到服务器时,
pip freeze会导出全局所有包,生成一个巨大的、包含大量无关项的requirements.txt,导致服务器部署失败
在进行实际项目开发时,尤其是多人协作的,如果使用全局环境管理第三方依赖,它的缺点会带来灾难性问题。基于此,Python提供了一种 虚拟环境 机制,用于不同的项目拥有自己的Python解释器和自己的依赖管理。
一、虚拟环境
此节介绍Python版本内置的标准模块venv,venv用于创建轻量级的“虚拟环境”。
venv仅作环境的管理,第三方依赖的安装管理需要依赖pip
工作原理:
- 建立目录结构:创建一个包含
bin/(Linux/mac) 或Scripts/(Windows) 的文件夹。 - 符号链接/副本:将系统中的 Python 解释器链接或拷贝到该目录下。
- 环境隔离:修改环境变量(主要是
PATH),使得在该环境下运行python或pip时,系统会优先查找虚拟环境内部的路径。
创建虚拟环境语法:
1 | |
dir:虚拟环境目录名称,通常采用.venv--system-site-packages:允许虚拟环境访问全局的site-packages(默认是完全隔离的)--clear:在创建前如果目录已存在,先清空目录--prompt <name>:指定激活环境后命令行显示的提示符前缀,默认情况prompt为虚拟环境目录名,即和dir相同
创建好环境以后,一定要先激活环境,在安装依赖,此时依赖才会安装在虚拟环境下
其他常用操作命令:
| 任务 | Windows (PowerShell/CMD) | macOS / Linux (Bash/Zsh) |
|---|---|---|
| 激活环境 | .venv\Scripts\activate |
source .venv/bin/activate |
| 检查路径 | where python |
which python |
| 退出环境 | deactivate |
deactivate |
| 导出依赖 | pip freeze > requirements.txt |
pip freeze > requirements.txt |
| 安装依赖 | pip install -r requirements.txt |
pip install -r requirements.txt |
操作示例:
1 | |
二、PIP依赖管理
pip (Package Installer for Python) 是 Python 的官方包管理工具,用于从 PyPI (Python Package Index) 下载、安装和管理第三方库。
完成虚拟环境的创建以后,我们就可以使用pip安装第三方依赖。
1、子命令概览
| 子命令 | 功能描述 | 常用场景 |
|---|---|---|
install |
安装包 | 安装第三方库、从 requirements 文件批量安装 |
download |
下载包但不安装 | 离线部署、准备离线安装包 |
uninstall |
卸载包 | 移除不再需要的库 |
freeze |
导出已安装包及其版本 | 生成 requirements.txt |
list |
列出已安装的包 | 查看当前环境有哪些库、检查过期版本 |
show |
显示已安装包的详细信息 | 查看安装路径、依赖关系、作者信息 |
check |
检查已安装包的依赖完整性 | 排查版本冲突、依赖缺失 |
config |
管理本地和全局配置 | 修改镜像源、设置默认参数 |
wheel |
根据依赖构建 Wheel格式(.whl) 包 |
打包自己的项目 |
cache |
管理 pip 的缓存 | 清理缓存以节省磁盘空间 |
hash |
计算软件包档案的哈希值 | 安全校验 |
2. 命令选项
2.1 install - 安装包
用于从 PyPI 或其他源安装软件包。
| 常用选项 | 说明 | 示例 |
|---|---|---|
==<version> |
安装特定版本 | pip install requests==2.31.0 |
>=, <=, != |
范围安装或排除特定版本 | pip install "requests>=2.0,<3.0" |
-r, --requirement <file> |
从 requirements 文件批量安装 | pip install -r requirements.txt |
-U, --upgrade |
升级指定的包 | pip install -U requests |
-i <url> |
指定镜像源地址 | pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple |
--no-cache-dir |
禁用缓存,每次都重新下载 | pip install torch --no-cache-dir |
--force-reinstall |
如果包已经按照,再次安装会提示已安装,也强制重新安装 | pip install --force-reinstall requests |
在按照依赖的时候,可能会遇到下载很慢的情况,此时我们可以变更依赖镜像源为国内源。
设置为清华源:
1 | |
1 | |
2.2 download - 下载包
下载软件包到本地,但不进行安装。常用于离线部署。
| 常用选项 | 说明 | 示例 |
|---|---|---|
-d, --dest <dir> |
指定下载目录 | pip download requests -d ./pkgs |
--python-version |
指定 Python 版本,默认为当前python解释器版本主版本号.次版本号.补丁号 或 去掉点号 |
pip download django --python-version 310 |
2.3 uninstall - 卸载包
从当前环境中移除软件包。
| 常用选项 | 说明 | 示例 |
|---|---|---|
-y, --yes |
卸载时不询问确认 | pip uninstall requests -y |
-r <file> |
批量卸载文件中的包 | pip uninstall -r requirements.txt |
目前 pip uninstall 只会移除指定包本身,依赖包不会关联删除
2.4 freeze - 导出依赖
以 requirements 格式输出已安装的包,通常用于环境锁定。
| 常用选项 | 说明 | 示例 |
|---|---|---|
--all |
包含 pip 等基础工具本身 | pip freeze --all |
1 | |
2.5 list - 列出已安装包
查看当前环境下安装的所有库。
| 常用选项 | 说明 | 示例 |
|---|---|---|
-o, --outdated |
列出可更新的包 | pip list -o |
-u, --uptodate |
列出已是最新版本的包 | pip list -u |
--format |
输出格式 (columns, json, freeze),默认columns |
pip list --format json |
--not-required |
列出不被其他包依赖的包 | pip list --not-required |
2.6 show - 查看包详情
显示特定安装包的详细信息(路径、依赖、作者等)。
| 常用选项 | 说明 | 示例 |
|---|---|---|
-f, --files |
列出该包安装的所有文件列表 | pip show requests -f |
1 | |
2.7 check - 检查依赖冲突
验证已安装的包是否有不兼容的依赖关系。
1 | |
2.8 config - 管理配置
管理 pip 的local global配置文件(如镜像源)。
local:针对当前所在环境生效global:全局,针对所有项目的所有环境生效
| 常用选项 | 说明 | 示例 |
|---|---|---|
list |
列出当前所有配置 | pip config list |
set |
设置配置项 | pip config set global.index-url <url> |
unset |
删除配置项 | pip config unset global.index-url |
get |
获取配置项 | pip config get global.index-url |
2.9 cache - 缓存管理
管理 pip 下载产生的缓存文件。
| 常用选项 | 说明 | 示例 |
|---|---|---|
dir |
显示缓存目录路径 | pip cache dir |
info |
显示缓存统计信息 | pip cache info |
purge |
清除所有缓存 | pip cache purge |
remove <pattern> |
移除匹配特定名称的缓存,pattern可以是一个包名称或模糊匹配 |
pip cache remove numpy |
2.10 hash - 计算哈希
计算软件包文件(特指.whl)的哈希值,用于安全校验。
| 常用选项 | 说明 | 示例 |
|---|---|---|
-a, --algorithm |
指定哈希算法 (sha256/384/512) |
pip hash -a sha256 my_pkg.whl |
2.11 wheel - 构建包
用于将包及其所有依赖项下载并打包成二进制文件存储在本地。构建的wheel包可以用于离线安装避免编译。
| 选项 | 说明 | 示例 |
|---|---|---|
-w --wheel-dir <dir> |
指定存放生成的 .whl 文件的目录 |
pip wheel requests -w ./dist |
-r --requirement <file> |
从需求文件中读取包名进行批量构建 | pip wheel -r requirements.txt |
--no-deps |
不下载/不构建依赖项,仅处理指定的包,默认情况下会将依赖包一起构建 | pip wheel flask --no-deps |
3. 全局通用选项 (General Options)
这些选项可以配合任何子命令使用:
| 全局参数 | 说明 | 示例 |
|---|---|---|
-h, --help |
显示帮助信息 | pip install --help |
-v, --verbose |
输出详细日志 (可用三次) | pip install -vvv requests |
-q, --quiet |
静默模式,减少输出 | pip uninstall -q requests |
--proxy <proxy> |
指定代理服务器 | pip install requests --proxy http://user:pass@host:port |
--timeout <sec> |
设置连接超时时间 | pip install requests --timeout 120 |