最稳方法是用pip show 包名查Location路径,或导入后用包名.__file__定位实际加载文件;前者适合命令行场景,后者适用于已成功import的情况。

直接用 pip show 或 Python 的 __file__ 属性就能查到,不需要进 site-packages 目录里手动翻。
用 pip show 查安装路径(最稳,适合命令行场景)
这是最可靠的方式,尤其当你不确定库是否被 import 过、或者环境里有多个 Python 版本时:
- 运行
pip show requests(把requests换成你要查的库名),输出里Location:行就是它所在的 site-packages 路径 - 如果提示
Package(s) not found,说明该库没装在当前 pip 环境下——可能是用 conda 装的,或在别的虚拟环境中 - 注意:
pip show显示的是整个包的根路径(比如/path/to/site-packages),不是具体 .py 文件位置;但绝大多数纯 Python 库的源码就直接落在这个目录下
用 __file__ 属性定位实际加载的模块文件(适合已成功 import 的情况)
一旦你已经 import 过这个库,Python 会记录它从哪加载的,__file__ 就是那个真实路径:
- 执行
import numpy; print(numpy.__file__)→ 输出类似/usr/local/lib/python3.11/site-packages/numpy/__init__.py - 对子模块也有效:
import numpy.linalg; print(numpy.linalg.__file__)会指向具体的linalg.py或__init__.py - 如果库是 C 扩展(如
numpy的核心部分),__file__可能指向一个.so或.pyd文件,这时源码不在那里,得去 GitHub 或 PyPI 页面找原始代码
为什么 pkg_resources 和 importlib.resources 不推荐直接用来查路径?
这两个模块设计初衷是读取包内资源(如配置、模板、数据文件),不是定位源码路径:
立即学习“Python免费学习笔记(深入)”;
-
pkg_resources.get_distribution("requests").location返回的其实是pip show里的Location,功能重复,且pkg_resources已被标记为 legacy -
importlib.resources.files("requests")在 Python 3.9+ 可用,但它返回的是Traversable对象,需要调用.joinpath("__init__.py").read_text()才能碰文件,路径还得额外转 —— 多此一举 - 更关键的是:它们都绕不开“先 import 成功”这个前提,而有些库(比如只含 C 扩展没
__init__.py的)可能根本 import 不进来,反而让你误以为路径查不到
真正容易被忽略的是:同一个库名,在不同环境(venv、conda、系统 Python)下路径完全不同;哪怕在同一台机器,用 pip install --user 装的库也会落在 ~/.local/lib/... 下。别只记路径,先确认你在哪个 Python 解释器、哪个 pip 实例下操作。


















