从requirements文件中删除未使用的软件包。

93

有没有简单的方法从requirements文件中删除不再使用的包?

我为此编写了一个bash脚本,但它并没有像我预期的那样工作。因为有些包不是按照它们在PyPI项目中的名称使用的。例如:

dj-database-url

包被用作

dj_database_url

我的项目在自己的需求文件中有许多包,所以逐个搜索它们太混乱、容易出错并且耗时过长。据我所知,集成开发环境还没有这个功能。


我最近发布了 deptry,这是一个命令行实用程序,用于检查项目依赖项的各种问题,例如过时、缺失或传递依赖项。它支持自版本0.4.0起的 requirement.txt 文件。 - Florian
5个回答

135
你可以在PyCharm中使用代码检查。
  1. 删除你的requirements.txt文件的内容,但保留空文件。
  2. 在PyCharm中加载你的项目,然后进入Code -> Inspect code...
  3. 在对话框中选择Whole project选项并点击OK。 在检查结果面板中,找到Python下的Package requirements部分(请注意,该部分只有在有requirements.txtsetup.py文件时才会显示)。 该部分将包含以下消息之一:
  • Package requirement '<package>' is not satisfied如果有任何列在requirements.txt中但未在任何.py文件中使用的软件包。
  • Package '<package>' is not listed in project requirements 如果有任何在.py文件中使用,但未列在requirements.txt中的软件包。

你需要关注第二个检查。 你可以右键单击Package requirements部分并选择Apply Fix 'Add requirements '<package>' to requirements.txt'来添加所有使用的软件包到requirements.txt。请注意,它只会显示一个软件包名称,但如果应用于该部分,它实际上会添加所有使用的软件包到requirements.txt

如果你想要,你也可以一个一个地添加它们,只需右键单击对应某个软件包的检查并选择Apply Fix 'Add requirements '<package>' to requirements.txt',然后为此类检查重复此操作。

在此之后,你可以创建干净的虚拟环境,并从新的requirements.txt中安装软件包。

请注意,PyCharm具有导入优化功能,请参见优化导入...。在执行上述任何其他步骤之前使用此功能可能会很有用。

为所有未在requirements.txt列表中列出的包应用修复


1
代码检查对我很有帮助。谢谢。 - Eli
我按照2016.2版本,构建162.1237.1的指示进行操作,但它错过了几个导入。似乎在从模块中导入名称方面存在问题。例如,在我的一个文件的顶部是: from rest_framework import status 但使用上述步骤时,它没有将rest_framework添加到我的要求文件中。 - Nwilson
3
虽然这是一次不错的尝试,但对于模块名称与包名称不同的软件包来说并非最佳解决方案,正如@Nwilson所指出的那样。此外,PyCharm不会将版本号添加到需求中,这对于任何试图清理生产项目的人都是有问题的。 - Daniel van Flymen
有没有办法在PyCharm中自动添加指定版本? - Vic
7
为了更新PyCharm的新版本(对我来说,在2020.3专业版中有效):可以使用“同步Python要求”工具(在“工具”菜单下),而不是从头开始建立新的requirements.txt文件。它会查找并删除未使用的软件包(勾选“删除未使用的要求”框)。 - brianmaissy
1
如果你在“ inspect ”项目时包含了所有依赖项,这可能会是一场噩梦,所以请删除依赖项(如果您已经初始化了虚拟环境),然后按照@NickAb给出的答案进行操作。 - Franco Gil

23
最好的方法是使用一个(新鲜的) Python venv/virtual-env,不安装任何包或者只安装你确定需要的包,测试你的程序 - 在遇到问题时,使用pip安装缺失的包,这对于大多数软件来说应该很快,然后使用pip freeze命令列出你真正需要的包。更好的方法是使用pip wheel来创建一个包含这些包的wheel文件。
另一种方法是:
  1. 使用pylint检查每个文件是否有未使用的导入并删除它们(无论如何您都应该这样做),
  2. 运行测试以确保正确性,
  3. 使用像snakefoodsnakefood3这样的工具生成您的新依赖列表。
请注意,为了使依赖关系检查正常工作,建议避免在函数中进行条件导入和导入操作。
此外,请注意,为了确保拥有所有东西,最好建立一个新的venv/virtual-env,并从你的依赖列表中安装,然后重新测试你的代码。

谢谢回答。我们也使用virtual-env(应用程序也在生产中)。这个问题是在重构期间提出的,所以我才问的。 - myildirim
1
请注意,snakefood 不支持 python3,目前网站上源代码的 URL 是错误的,正确的 URL 是:https://github.com/blais/snakefood。 - miyalys
2
@miyalys - 感谢您的提醒 - 在pypi上进行快速搜索可以找到snakefood3(https://github.com/Trim21/snakefood3),但我还没有尝试过,因为我更喜欢使用裸的venv作为起点。 - Steve Barnes

17

您可以使用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的作者。

1
感谢@Florian提供这个工具,我在我的一个小项目上本地试用了一下,效果不错。但是对于utilviews的导入却出现了以下依赖错误,这只是误报:
该项目的依赖列表中缺少以下依赖项: util views请考虑将它们添加到您的项目依赖项中。
- pranavcode
感谢 @pranavcode 的反馈。目前,您可以通过运行deptry . -io util,views或将配置添加到pyproject.toml来忽略它们。您能否详细说明它们为什么是误报? utilviews似乎不是标准库的一部分。 deptry还应该忽略具有__init__.py文件的相对导入和本地目录。您是否考虑在GitHub存储库中提出问题?我很乐意根据您的反馈改进deptry - Florian
@pranavcode 我终于成功重现了你描述的那个 bug。在发布版本 0.6.2 中已经通过 这个 合并请求解决了。 - Florian
@Florian 这个工具本来很不错,但目前有些包被标记为“该项目包含过时的依赖项”,实际上并不是过时的。这使得该包无法在真实项目中使用,非常遗憾。 - HAL9000
@HAL9000 很抱歉回复晚了,感谢您的反馈。我很好奇您遇到问题的原因,我自己还没有遇到过这个问题。作为一种解决方法,您可以按照以下方式配置deptry来忽略它们:deptry . --ignore-obsolete "foo,bar" - Florian

8
Pycharm 中,前往 工具 -> 同步 Python 需求。这里有一个“删除未使用的需求”复选框。

它就像一个……魔法一样好用!这是所有答案中最顺畅、最干净、最快速的解决方案。 - steel00
它就像一个……魔法一样好用!这是所有答案中最顺畅、最干净、最快速的解决方案。 - undefined
嗯,这个是使用你配置的解释器来与 requirements.txt 文件同步吗?如果解释器有多余的包会怎么样呢? - user3180
如果解释器有多余的包,该怎么办?请前往 文件 -> 设置 -> 项目 -> Python 解释器,删除您不使用的包。 - Diego Portillo
是的,这只是使用您配置的解释器与requirements.txt文件同步吗?是的 - Diego Portillo

0
我已成功地使用了 pip-check-reqs
使用命令 pip-extra-reqs 您的目录,它将检查 您的目录 中所有未使用的依赖项。
使用pip install pip-check-reqs安装它。

此工具无法从 setup.cfg 文件中读取要求,而该文件仍然是在2020年指定要求的最便携位置(由于缺乏关于 pyproject.toml 格式的共识)。 - sorin
2
更新:版本2.2添加了“--requirements-file”和“--skip-incompatible”标志(完全透明:我做了PR)。我们在工作中广泛使用它,约200个库,以此方式保持要求的清洁毫无问题。 - Błażej Michalik
@sorin 如果你能给我一个好的例子,我可能会尝试实现它。此外,使用 setup.cfg 单独已经要求使用 pyproject.toml 了吧?(https://setuptools.readthedocs.io/en/latest/setuptools.html#setup-cfg-only-projects) - Błażej Michalik
如果你的项目结构不是很复杂,可以使用 pip-missing-reqs my_app_folder_container。我在一个中等规模的 FastApi 项目中使用这个包,效果非常好。 - Franco Gil
2
更新自2022年,我使用了pip-check-reqs。它有效。 - kay fresh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接