pip要求解析器 - 一个基本正确的pip要求解析库,因为它使用了pip自己的代码。
项目描述
版权所有(C)nexB Inc. 及他人。版权所有(C)pip 开发者(参见AUTHORS.rst 文件)SPDX-License-Identifier: MIT 主页:https://github.com/nexB/pip-requirements 和 https://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》库拥有一个庞大的测试套件,包括
pip自己的测试
新的单元测试
新的需求测试文件(超过40个新测试文件)
一些主要其他需求解析器的测试套件,包括
因此,它可能拥有最全面的需求解析测试套件。
用法
入口点是< 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 >
复用并包装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 >
项目详细信息
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。
源代码发行版
构建发行版
哈希值 for pip_requirements_parser-32.0.1-py3-none-any.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 4659bc2a667783e7a15d190f6fccf8b2486685b6dba4c19c3876314769c57526 |
|
MD5 | 5eff36482f1eae8c357d635bd3c1eb4c |
|
BLAKE2b-256 | 54d0d04f1d1e064ac901439699ee097f58688caadea42498ec9c4b4ad2ef84ab |