pip list 列出当前环境所有已安装包及版本,但混杂第三方包、内置模块和开发依赖;推荐用 --outdated、--local 等参数过滤,或用 pip show 查详细信息;requirements.txt 并非真实依赖快照,建议用 pipreqs 或 pip-compile 生成;python 3.12+ 应用 importlib.metadata 替代已弃用的 pkg_resources。

pip list 能看到所有包,但默认不区分来源
直接运行 pip list 是最快的方式,它列出当前 Python 环境中所有已安装的包和版本号。但要注意:它混着显示了通过 pip 安装的第三方包、系统自带的内置模块(比如 setuptools、wheel),甚至一些开发依赖——你不一定都需要关注它们。
更实用的做法是加个过滤:
-
pip list --outdated:只看哪些包有新版本可升级 -
pip list --local:排除 site-packages 外的全局包(比如 macOS Homebrew Python 下可能混入的系统包) -
pip list | grep "requests"(Linux/macOS)或pip list | findstr "requests"(Windows):快速定位某个包是否存在及版本
pip show requests 查具体包的详细信息
当你想确认某个包是否真的装对了、装在哪、依赖了谁,pip show 比 pip list 更靠谱。比如查 requests:
pip show requests
输出里会包含:Version、Summary、Home-page、Author、Location(实际安装路径)、Requires(它依赖哪些包)和 Required-by(哪些包依赖它)。
- 如果报错
Package 'xxx' is not installed,说明它没装在当前环境,可能是虚拟环境没激活,或者装在别的 Python 解释器下 -
Location路径如果指向/usr/local/lib/...或C:\Users\...\AppData\Roaming\...,得小心是不是装到了用户级而非项目级 - 注意
Requires里的包不一定都出现在pip list结果里——有些是条件依赖,或被其他包“带进来”但没显式安装
requirements.txt 不等于当前环境真实状态
很多人以为 pip freeze > requirements.txt 就能完整还原环境,其实这文件只是当前 pip list 的快照,有几个关键偏差:
- 它会把
pip、setuptools、wheel这类构建工具也写进去,而这些通常不该进生产requirements.txt - 如果用
pip install -e .装了本地包,pip freeze会显示成-e git+https://...或路径形式,别人没法直接复现 - 不同平台编译的包(比如
numpy)在pip freeze里版本号一样,但底层 wheel 可能不兼容,光靠它做环境同步容易出ImportError - 推荐替代方案:
pipreqs .(只扫描项目代码里import的包),或用pip-compile(从pyproject.toml或setup.py推导依赖树)
Python 3.12+ 用 importlib.metadata 替代 pkg_resources
老代码里常见 pkg_resources.get_distribution("requests").version 来查版本,但这在 Python 3.12 已被移除,且性能差、启动慢。现在标准做法是:
from importlib import metadata<br>print(metadata.version("requests"))
如果包没装,会抛 metadata.PackageNotFoundError,不是静默返回 None。
- 别再用
pkg_resources—— 它已 deprecated,且在某些打包场景(如 PyInstaller)下根本不可用 -
metadata.distribution("xxx")可以拿到更多元数据,比如.read_text("RECORD")查文件清单 - 注意:
importlib.metadata在 Python importlib-metadata,但名字和模块名不一致,容易配错
which python 和 which pip(macOS/Linux)或 where python 和 where pip(Windows)是否指向你认为的那个环境。Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











