从需求文件中删除未使用的包
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.txt
或setup.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
?。以上是关于从需求文件中删除未使用的包的主要内容,如果未能解决你的问题,请参考以下文章