跳转到主要内容

pip要求解析器 - 一个基本正确的pip要求解析库,因为它使用了pip自己的代码。

项目描述

版权所有(C)nexB Inc. 及他人。版权所有(C)pip 开发者(参见AUTHORS.rst 文件)SPDX-License-Identifier: MIT 主页:https://github.com/nexB/pip-requirementshttps://www.aboutcode.org/

pip-requirements-parser 是一个基本正确的 pip 要求解析库……因为它使用了 pip 的自身代码!

pip 是用于 Python 的包安装器,它使用“要求”文本文件列出要安装的包。

根据 https://pip.pythonlang.cn/en/stable/reference/requirements-file-format/

“要求文件格式与 pip 的许多内部细节紧密相关(例如,pip 的命令行选项)。基本格式相对稳定且可移植,但如上所述的完整语法仅适用于 pip,其他工具在使用之前应考虑这一点。”

并且根据 https://pip.pythonlang.cn/en/stable/user_guide/#using-pip-from-your-program

“[..] pip 是一个命令行程序。虽然它是用 Python 实现的,因此可以通过导入 pip 从您的 Python 代码中使用,但您不得以这种方式使用 pip 的内部 API。”

“在实践中,这意味着 pip 中的所有内容都被视为实现细节。甚至导入名称为 pip 的事实也可能在未经通知的情况下更改。虽然我们尽量不破坏东西,但所有内部 API 都可能在任何时间、任何原因下更改。这也意味着我们通常不会修复由以不支持的方式使用 pip 而导致的问题。”

正因为如此,pip 要求文件以其多样性而闻名,难以正确解析,因为

  • pip 没有公开的 API,因此不能作为稳定的库可靠地使用。尽管如此,一些库试图这样做。(见替代方案)

  • pip 要求文件语法与 pip 的命令行界面和命令行选项紧密对齐。从某种意义上说,pip 要求文件是一系列 pip 命令行选项和参数。因此,除非复制 pip 命令行选项解析,否则很难解析这些内容。至少有一个其他库正在使用命令行选项解析器来正确解析选项。

这个 pip-requirements-parser Python 库是另一个 pip 要求文件解析器,但这一次希望正确地完成,并且做得与 pip 一样好,因为这是使用 pip 的自身代码。

pip-requirements-parser 库提供以下关键优势

  • 其他要求解析器通常不适用于 pip 所支持的所有情况:解析野外看到的任何要求可能会失败解析一些有效的 pip 要求。由于 pip-requirements-parser 库基于 pip 的自身代码,它将像 pip 一样工作,并解析 pip 可以解析的所有要求文件。

  • pip-requirements-parser 库提供了一个简单且稳定的代码 API,不会在未经通知的情况下更改。

  • pip-requirements-parser 库设计为离线工作,无需进行任何外部网络调用,而原始 pip 代码需要网络访问。

  • pip-requirements-parser 库是一个文件,可以轻松地根据需要复制,以便轻松地进行供应商化。这对于在受限环境中启动通常是必需的。

  • pip-requirements-parser 库只依赖于公共“packaging”包的一个外部依赖项。否则,它仅使用标准库。好处与单文件相同:更少的可移动部分有助于在更多情况下使用它。

  • 《pip-requirements-parser》库复用了pip测试套件中与需求相关的全部子集。这并不令人惊讶,因为这是pip自己的代码。该套件经过仔细移植和调整,以适应更新的代码子集。

  • 标准的pip需求解析器依赖于< span class="docutils literal" > requests < / span > HTTP库,在解析时与PyPI和其他引用存储库建立网络连接。《pip-requirements-parser》库完全离线工作,并已完全移除requests依赖和调用。

  • 《pip-requirements-parser》库保留了我们所保留的代码子集的完整的pip git历史。原始pip代码从多个模块合并,并使用一些git fu和git filter repo保持了所有git历史在行/责任级别。好处是我们将能够更容易地跟踪和合并未来的pip更新。

  • 《pip-requirements-parser》库拥有一个庞大的测试套件,包括

因此,它可能拥有最全面的需求解析测试套件。

用法

入口点是< span class="docutils literal" > RequirementsFile < / span >对象

>>> from pip_requirements_parser import RequirementsFile
>>> rf = RequirementsFile.from_file("requirements.txt")
从那里,您可以将其导出到字典:
>>> rf.to_dict()

或访问需求(安装需求或可编辑需求对象)

>>> for req in rf.requirements:
...    print(req.to_dict())
...    print(req.dumps())

以及各种其他解析元素,例如选项、注释和有解析错误的无效行

>>> rf.options
>>> rf.comment_lines
>>> rf.invalid_lines

这些以及< span class="docutils literal" > requirements < / span >都有一个“requirement_line”属性,其中包含原始文本。

最后,您可以将需求文件作为字符串获取

>>> rf.dumps()

替代方案

还有其他几种解析器,它们或者

  • 实现自己的解析,因此可能会错过一些细微的差异

  • 或包装并导入pip作为库,以解决pip API缺乏的问题

这些都没有使用复用和分支pip所需解析需求的部分的方法。包装pip的解析器需要像pip一样进行网络访问。它们可能需要在每次有新的pip版本发布时进行更新。重新实现pip解析的解析器可能不支持所有pip特定功能。

实现新的pip解析器

  • pip-api < a href="https://github.com/di/pip-api" rel="nofollow" > https://github.com/di/pip-api < / a > 不支持哈希和某些pip选项。但是,它确实使用argparse进行解析选项,因此正确处理了大多数选项。解析器是一个单一的脚本,只依赖于打包(即供应商)。但是,它不是设计为单独的脚本使用的,pip是依赖项。

  • requirements-parser < a href="https://github.com/madpah/requirements-parse" rel="nofollow" > https://github.com/madpah/requirements-parse < / a > 不支持哈希和某些pip选项

  • dparse < a href="https://github.com/pyupio/dparse" rel="nofollow" > https://github.com/pyupio/dparse < / a >

  • https://github.com/GoogleCloudPlatform/django-cloud-deploy/blob/d316b1e45357761e2b124143e6e12ce34ef6f975/django_cloud_deploy/skeleton/requirements_parser.py

复用并包装pip自己的解析器

  • requirementslib < a href="https://github.com/sarugaku/requirementslib" rel="nofollow" > https://github.com/sarugaku/requirementslib < / a > 使用pip-shim < a href="https://github.com/sarugaku/pip-shims" rel="nofollow" > https://github.com/sarugaku/pip-shims < / a >,它是一组围绕每个pip版本设置的“shim”,试图提供pip API。带有20+依赖项,

  • micropipenv < a href="https://github.com/thoth-station/micropipenv/blob/d0c37c1bf0aadf5149aebe2df0bf1cb12ded4c40/micropipenv.py#L53" rel="nofollow" > https://github.com/thoth-station/micropipenv/blob/d0c37c1bf0aadf5149aebe2df0bf1cb12ded4c40/micropipenv.py#L53 < / a >

  • pip-tools < a href="https://github.com/jazzband/pip-tools/blob/9e1be05375104c56e07cdb0904e1b50b86f8b550/piptools/_compat/pip_compat.py" rel="nofollow" > https://github.com/jazzband/pip-tools/blob/9e1be05375104c56e07cdb0904e1b50b86f8b550/piptools/_compat/pip_compat.py < / a >

项目详细信息


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码发行版

pip-requirements-parser-32.0.1.tar.gz (209.4 kB 查看哈希值)

上传时间 源代码

构建发行版

pip_requirements_parser-32.0.1-py3-none-any.whl (35.6 kB 查看哈希值)

上传时间 Python 3

由以下支持