从需求文件中删除未使用的包
有没有什么简单的方法可以从requirements文件中删除不再使用的包呢?
我写了一个bash脚本来完成这个任务,但结果并没有达到我的预期。因为有些包在使用时并不是按照它们在PyPI上的项目名称来引用的。例如:
dj-database-url
这个包是以
dj_database_url
的方式被使用的。
我的项目在requirements文件中有很多包,所以一个一个去查找实在是太麻烦了,容易出错,而且耗时太长。我发现目前的IDE(集成开发环境)还没有这个功能。
5 个回答
我成功地使用了 pip-check-reqs 这个工具。
通过输入命令 pip-extra-reqs your_directory
,它会检查 your_directory
这个文件夹里所有未使用的依赖项。
你可以用 pip install pip-check-reqs
来安装它。
在pycharm中,找到工具 -> 同步Python依赖。这里有一个'移除未使用的依赖'的复选框。
最好的办法是使用一个(全新的)Python虚拟环境(venv),里面不要有任何包,或者只安装你确实知道需要的那些包。先测试你的程序,遇到缺少的包时用pip
来安装,这样大部分软件都能很快解决问题。然后用pip freeze
命令来列出你真正需要的包。更好的是,你可以用pip wheel
来创建一个包含这些包的轮子文件。
另一种方法是:
- 使用pylint检查每个文件,找出未使用的导入并删除它们(其实你应该一直这样做),
- 运行你的测试,确保这样做是正确的,
- 使用像snakefood或snakefood3这样的工具生成你新的依赖列表。
需要注意的是,为了让依赖检查工作得更好,建议避免使用条件导入和在函数内部导入。
另外,为了确保你有所有需要的东西,最好是建立一个新的虚拟环境,然后根据你的依赖列表安装包,最后再测试你的代码。
你可以通过使用deptry这个命令行工具来找到过时的依赖项。它可以检查项目中的各种问题,比如哪些依赖没用、缺失或者是间接依赖。
你可以通过以下方式把它添加到你的项目中:
pip install deptry
然后运行:
deptry .
示例输出:
Scanning 2 files...
requirements.txt: DEP002 'pandas' defined as a dependency but not used in the codebase
Found 1 dependency issue.
请注意,为了获得最佳效果,建议你在项目中使用虚拟环境,具体可以参考这里。
免责声明:我是deptry
的作者。
你可以在PyCharm中使用代码检查功能。
- 先把你的
requirements.txt
文件里的内容删掉,但要保留这个空文件。 - 把你的项目加载进来,
- 在PyCharm中,点击
代码 -> 检查代码...
。 - 在弹出的对话框中选择
整个项目
选项,然后点击确定
。 在检查结果面板中找到包要求
这一部分,位置在Python
下面(注意,只有当有requirements.txt
或setup.py
文件时,这一部分才会显示)。 这一部分会包含以下信息之一:
- 如果
requirements.txt
中列出的某个包没有在任何.py文件中使用,会显示包要求 '<package>' 没有满足
。 - 如果某个包在.py文件中被使用,但没有在
requirements.txt
中列出,会显示包 '<package>' 没有在项目要求中列出
。
你需要关注第二种检查结果。
你可以通过右键点击包要求
部分,选择应用修复 '将要求 '<package>' 添加到 requirements.txt'
来把所有使用过的包添加到requirements.txt
中。注意,这里只会显示一个包的名字,但实际上如果对这一部分进行操作,会把所有使用过的包都添加到requirements.txt
中。
如果你愿意,也可以一个一个地添加,只需右键点击对应某个包的检查结果,选择应用修复 '将要求 '<package>' 添加到 requirements.txt'
,对每个这样的检查结果重复这个操作。
完成后,你可以创建一个干净的虚拟环境,并从新的requirements.txt
中安装包。
另外,PyCharm还有一个导入优化的功能,可以查看优化导入...。在进行上述其他步骤之前,使用这个功能会很有帮助。