pip-check 只能检查过时包,完全不能识别未使用依赖;deptry 是目前最靠谱的静态分析方案,但必须配合项目结构规范才能准确工作。

直接说结论:pip-check 只能检查过时包,完全不能识别未使用依赖;deptry 是目前最靠谱的静态分析方案,但必须配合项目结构规范才能准确工作。
为什么 pip-check 根本不解决“未使用依赖”问题
pip-check 的设计目标是比对 pip list 和 PyPI 最新版本,只报「可升级」或「有安全警告」的包。它从不扫描你的代码,也不读 requirements.txt 或 pyproject.toml —— 所以哪怕你删光所有 import,它依然显示「No outdated packages found」。
常见误用场景:
- 运行
pip-check后没看到警告,就以为依赖很干净 → 实际可能堆了 10 个从未 import 过的包 - 把
pip-check当作 CI 检查项 → 完全无效,CI 里跑它等于白跑
deptry 怎么真正检测未使用依赖
deptry 会同时做三件事:解析 pyproject.toml(或 setup.py/requirements.txt),扫描全部 .py 文件里的 import 语句,再比对两者差异。它不运行代码,纯静态分析,所以快且安全。
但要注意这些硬性前提:
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 项目必须用
pyproject.toml(推荐)或明确的requirements.txt;如果依赖散落在多个文件或靠pip install -e .动态加载,deptry会漏判 -
import必须是顶层静态导入;动态导入如__import__(x)、importlib.import_module()不会被识别 - 测试文件(
tests/)默认不扫描,要加--scan-test-files参数才检查
基础用法:
pip install deptry deptry . --requirements-txt requirements.txt
输出类似:unused_dependency: requests (in requirements.txt) —— 表示 requests 在 requirements.txt 里声明了,但整个项目没任何地方 import requests。
deptry 容易被忽略的三个坑
很多人跑完 deptry 发现结果不准,多半栽在这几个点上:
-
pyproject.toml里用了[tool.poetry.dependencies]但没装poetry插件 → 需额外加参数:--project-type poetry - 项目有子模块(比如
src/mylib/),但deptry默认只扫当前目录下.py文件 → 要显式指定路径:deptry src/ tests/ --requirements-txt requirements.txt - 某些包只在类型提示里出现(如
from __future__ import annotations+def f(x: pandas.DataFrame):)→deptry默认不认为这是使用,需加--include-optional-deps或手动保留
真正清理依赖不是跑一个命令就完事的事——deptry 给的是线索,删之前得确认那个包是否被隐藏调用、是否在 CI 脚本里硬编码、或者只是你还没 grep 到的 import 路径。尤其当项目用了插件机制、配置驱动加载、或依赖注入框架时,静态分析天然有盲区。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










