从需求文件中删除未使用的包

Posted

技术标签:

【中文标题】从需求文件中删除未使用的包【英文标题】:Delete unused packages from requirements file 【发布时间】:2014-10-12 03:04:54 【问题描述】:

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

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

dj-database-url

包用作

dj_database_url

我的项目在它自己的需求文件中有很多包,因此,一个一个地搜索它们太混乱、容易出错并且花费太多时间。正如我搜索的那样,IDE 还没有这个属性。

【问题讨论】:

【参考方案1】:

您可以在PyCharm 中使用代码检查。

    删除requirements.txt 的内容,但保留空文件。 加载您的项目, PyCharm 转到 Code -> Inspect code...。 在对话框中选择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 具有导入优化功能,请参阅Optimize imports...。在上面列出的任何其他步骤之前使用此功能会很有用。

【讨论】:

代码检查对我很有用。谢谢。 我在 2016.2 版本中遵循了这些说明,构建 162.1237.1 并且它错过了几个导入。似乎从模块导入名称有问题。例如,在我的一个文件的顶部是:from rest_framework import status,它没有使用上述步骤将rest_framework 添加到我的需求文件中 虽然这是一个很好的尝试,但对于模块名称与包名称不同的包来说,这不是一个很好的解决方案,正如@Nwilson 指出的那样。此外,PyCharm 不会在需求中添加版本号,这对于任何试图在生产环境中清理项目的人来说都是有问题的。 有什么方法可以在 PyCharm 中自动添加指定版本? 更新 PyCharm 的较新版本(适用于我的 2020.3 Professional):您可以使用“同步 Python 要求”工具(在工具菜单)来查找和删除未使用的软件包(选中“删除未使用的要求”框)。【参考方案2】:

最好的办法是使用 (fresh) python venv/virtual-env 和 no 包,或者只使用那些你确定需要的包,测试你的包 -在遇到问题时使用pip 安装丢失的软件包,这对于大多数软件来说应该很快,然后使用pip freeze 命令列出您真正需要的软件包。更好的是,您可以使用pip wheel 来创建一个包含包的***。 另一种方法是:

    使用 pylint 检查每个文件是否有未使用的导入并将其删除(无论如何您都应该这样做), 运行测试以确保它是正确的, 使用snakefood 或snakefood3 等工具生成新的依赖项列表

请注意,为了使任何依赖项检查正常工作,建议避免在函数内进行条件导入和导入。

还请注意,为了确定您拥有一切,最好构建一个新的 venv/virtual-env 并从您的依赖项列表中安装,然后重新测试您的代码。

【讨论】:

感谢您的回答。我们也使用 virtual-env(该应用程序也在生产中)这个问题在重构期间提出。这就是我问的原因。 注意snakefood不支持python3,目前网站上的源地址错误,为:github.com/blais/snakefood @miyalys - 感谢您将其标记出来 - 在 pypi 上的快速搜索会抛出 snakefood3 (github.com/Trim21/snakefood3),我还没有尝试过,因为我更喜欢使用裸 venv 作为起点。 【参考方案3】:

我已经成功使用pip-check-reqs。

使用命令pip-extra-reqs your_directory 它将检查your_directory 中所有未使用的依赖项

使用pip install pip-check-reqs 安装它。

【讨论】:

不幸的是,该工具相当脆弱,以至于无法使用。它仅适用于非常狭窄的项目结构。它甚至不接受需求文件路径的参数,以防它不在***目录中,或者没有命名为“requirements.txt”,这两种情况都很常见。 只是 2020 年的更新,pip-check-reqs 仍然像 Cerin 所说的那样毫无用处。 此工具无法从setup.cfg 文件中读取需求,该文件仍然是 2020 年指定它们的最便携的地方(由于对 pyproject.toml 格式缺乏共识)。 更新:版本 2.2 添加了 --requirements-file--skip-incompatible 标志(完全披露:我做了 PR)。我们在大约 200 个库的工作中广泛使用它,并且以这种方式保持需求整洁没有问题。 @sorin 我可能会尝试实现它,如果你指出一个很好的例子。另外,setup.cfg 不是单独使用already mandate the usage of pyproject.toml?。

以上是关于从需求文件中删除未使用的包的主要内容,如果未能解决你的问题,请参考以下文章

如何识别哪些 npm 包只是对等依赖项?

npm命令用于卸载或修剪Node.js中未使用的包

如何从 venv 中删除无效的需求? (pycharm?)[重复]

从 apk 中删除特定的包类

如何从我的包用户的导入语句中删除输出文件夹?

删除 React 中未使用的依赖项