site-packages臃肿主因是无效分布残留、环境混用与缓存堆积;需优先识别并清理中断安装产生的“幽灵目录”,避免手动删除,应通过pip show定位路径后针对性卸载。

site-packages 目录变臃肿,不是因为装的包多,而是因为“重复装、没清理、乱混用”。
pip install 时残留的无效分布(invalid distribution)
最常见的臃肿源头是中断安装后留下的半成品。比如你在 pip install numpy 过程中按了 Ctrl+C,或者网络断开,pip 可能已解压部分文件到 site-packages,但没来得及写完 numpy-1.24.3.dist-info 目录。下次 pip 扫描时,看到一个叫 numpy-1.24.3 的文件夹但缺元数据,就记为 Ignoring invalid distribution numpy-1.24.3 —— 它被忽略,但没被删。
这类残留会越积越多,尤其在频繁试装/卸载/升级的开发环境中。它们不参与 import,也不被 pip list 显示,却真实占据磁盘空间。
- Windows 上常见命名异常:如
~umpy、numpy-、numpy-1.24.3-py3.9.egg-info(少了个dist-前缀) - Linux/macOS 上可能有临时文件名:如
numpy-1.24.3.tmp或带波浪线、点号开头的隐藏目录 - 这些文件夹通常不含
__init__.py,也不在sys.path中生效,纯属“幽灵占位”
虚拟环境未隔离或误用 --system-site-packages
当你用 python -m venv myenv --system-site-packages 创建环境,又在该环境下反复 pip install,结果可能是:全局 site-packages 的包被“影子引用”,而本地环境又叠加安装同名包的不同版本——numpy 可能同时存在于系统级和虚拟环境级,且各自有完整副本。
立即学习“Python免费学习笔记(深入)”;
更隐蔽的是 PyCharm 等 IDE 默认勾选 “Inherit global site-packages”,但开发者没意识到这会让 pip install 默认作用于全局路径(尤其当终端未激活虚拟环境时)。
- 检查当前 pip 实际写入位置:
python -c "import site; print(site.getsitepackages())" - 确认 pip 是否指向预期环境:
which pip(macOS/Linux)或where pip(Windows) - 一旦发现
pip install写到了系统site-packages,后续所有依赖都会层层叠加,体积指数增长
Docker 构建中未清理构建缓存与中间层
在 Dockerfile 中写 RUN pip install -r requirements.txt 是最常见写法,但它会把 pip 缓存、编译中间产物(如 build/、__pycache__/)、甚至 gcc 工具链全打包进镜像层。
例如 numpy 编译时产生的 .so 文件、临时 temp/ 目录、以及 pip 自己的 ~/.cache/pip 都可能被固化进最终镜像。
- 多阶段构建必须显式清除构建依赖:
RUN apt-get purge -y build-essential && rm -rf /var/lib/apt/lists/* - 禁用 pip 缓存:
RUN pip install --no-cache-dir -r requirements.txt - 避免 COPY 整个项目根目录,用
.dockerignore过滤venv/、__pycache__/、.git/
用户级安装与系统级安装混杂(尤其 Windows/macOS)
在非虚拟环境中执行 pip install --user,包会被装到用户目录(如 Windows 的 %APPDATA%\Python\Python39\site-packages),而系统级 pip install 走的是 C:\Python39\Lib\site-packages。两者物理隔离,但 Python 解释器启动时会把二者都加入 sys.path。
问题在于:同一包(如 requests)可能在两个路径下各存一份,且版本不同;你 pip uninstall requests 只会删掉其中一个,另一个继续“隐身占用空间”。
- 查用户级 site-packages:
python -c "import site; print(site.getusersitepackages())" - 查全部 site-packages 路径:
python -c "import site; print('\n'.join(site.getsitepackages() + [site.getusersitepackages()]))" - 不要手动删文件夹 —— 先用
pip show requests看它来自哪条路径,再针对性卸载
真正难清理的从来不是大包本身,而是那些既不被 import、也不被 pip list 列出、还拒绝被 pip uninstall 触及的“幽灵目录”。它们安静地躺在 site-packages 里,等某次 pip list 扫描时集体报出一串 Ignoring invalid distribution —— 那就是你该停下手上活儿,先做一次深度扫描的时候了。


















