虚拟环境与第三方模块管理

默认情况下,当我们直接使用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版本内置的标准模块venvvenv用于创建轻量级的“虚拟环境”。

venv仅作环境的管理,第三方依赖的安装管理需要依赖pip

工作原理:

  1. 建立目录结构:创建一个包含 bin/ (Linux/mac) 或 Scripts/ (Windows) 的文件夹。
  2. 符号链接/副本:将系统中的 Python 解释器链接或拷贝到该目录下。
  3. 环境隔离:修改环境变量(主要是 PATH),使得在该环境下运行 pythonpip 时,系统会优先查找虚拟环境内部的路径。

创建虚拟环境语法:

1
python -m venv <dir> --system-site-packages  --clear
  • 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 使用默认参数创建环境
duwei@probiecoder:~/workspace/python/base-python$ ls -a
. .. data.txt db.sqlite test_copy.txt test_move.txt test.py .vscode
duwei@probiecoder:~/workspace/python/base-python$ python -m venv .venv
duwei@probiecoder:~/workspace/python/base-python$ ls -a
. .. data.txt db.sqlite test_copy.txt test_move.txt test.py .venv .vscode


# 自定义虚拟环境名称
duwei@probiecoder:~/workspace/python/base-python$ ls -a
. .. data.txt db.sqlite test_copy.txt test_move.txt test.py .vscode
duwei@probiecoder:~/workspace/python/base-python$ python -m venv .vvv
duwei@probiecoder:~/workspace/python/base-python$ ls -a
. .. data.txt db.sqlite test_copy.txt test_move.txt test.py .vscode .vvv

# 自定义 prompt
duwei@probiecoder:~/workspace/python/base-python$ python -m venv .venv --prompt ^_^^_^
duwei@probiecoder:~/workspace/python/base-python$ source .venv/bin/activate
(^_^^_^) duwei@probiecoder:~/workspace/python/base-python$

二、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
pip config set global.index-url https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple
1
2
3
4
# 从镜像源下载包

# 从本地 wheel 文件安装

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
# 导出到文件
pip freeze > requirements.txt

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
3
4
5
6
7
8
9
10
11
(.venv) duwei@probiecoder:~/workspace/python/base-python$ pip show requests 
Name: requests
Version: 2.31.0
Summary: Python HTTP for Humans.
Home-page: https://requests.readthedocs.io
Author: Kenneth Reitz
Author-email: me@kennethreitz.org
License: Apache 2.0
Location: /home/duwei/workspace/python/base-python/.venv/lib64/python3.14/site-packages
Requires: certifi, charset-normalizer, idna, urllib3
Required-by:

2.7 check - 检查依赖冲突

验证已安装的包是否有不兼容的依赖关系。

1
2
(.venv) duwei@probiecoder:~/workspace/python/base-python$ pip check
No broken requirements found.

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