gpt4 book ai didi

python - 如何从 Python 包的 requires.txt 中读取依赖项

转载 作者:太空宇宙 更新时间:2023-11-03 15:45:34 24 4
gpt4 key购买 nike

我需要依赖项,因为我想将它们添加到我的 RPM 元数据中。

构建我使用:

python setup.py bdist_rpm

当我构建包 cryptography-2.2.2 时,它会创建一个文件 /src/cryptography.egg-info/requires.txt

它包含:

idna>=2.1
asn1crypto>=0.21.0
six>=1.4.1

[:platform_python_implementation != 'PyPy']
cffi>=1.7

[:python_version < '3']
enum34
ipaddress

如何读取所有依赖项,计算 [] 之间的表达式?

我正在使用 Python 2.7(不要问)

我需要以下输出:

idna>=2.1
asn1crypto>=0.21.0
six>=1.4.1
cffi>=1.7
enum34
ipaddress

我想省略其他部分,例如 [doc][test] 等等。

最佳答案

requires.txtdependency metadata 的一部分,因此您可以使用 easy_install 在安装 egg 时使用的相同工具。假设文件 requires.txt 在当前目录中:

In [1]: from pkg_resources import Distribution, PathMetadata

In [2]: dist = Distribution(metadata=PathMetadata('.', '.'))

现在您可以使用 Distribution.requires() 过滤当前平台的所有依赖项:

In [3]: sys.version
Out[3]: '3.6.4 (v3.6.4:d48ecebad5, Dec 18 2017, 21:07:28) \n[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)]'

In [4]: dist.requires()
Out[4]:
[Requirement.parse('idna>=2.1'),
Requirement.parse('asn1crypto>=0.21.0'),
Requirement.parse('six>=1.4.1'),
Requirement.parse('cffi!=1.11.3,>=1.7'),
Requirement.parse('cffi>=1.7')]

如果我使用 Python 2.7,列表会有所不同:

In [4]: sys.version
Out[4]: '2.7.10 (default, Oct 6 2017, 22:29:07) \n[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.31)]'

In [5]: dist.requires()
Out[5]:
[Requirement.parse('idna>=2.1'),
Requirement.parse('asn1crypto>=0.21.0'),
Requirement.parse('six>=1.4.1'),
Requirement.parse('cffi!=1.11.3,>=1.7'),
Requirement.parse('cffi>=1.7'),
Requirement.parse('enum34'),
Requirement.parse('ipaddress')]

或 PyPy:

In [2]: sys.version
Out[2]: '3.5.3 (fdd60ed87e941677e8ea11acf9f1819466521bf2, Apr 26 2018, 01:25:35)\n[PyPy 6.0.0 with GCC 4.2.1 Compatible Apple LLVM 9.1.0 (clang-902.0.39.1)]'

In [3]: d.requires()
Out[3]:
[Requirement.parse('idna>=2.1'),
Requirement.parse('asn1crypto>=0.21.0'),
Requirement.parse('six>=1.4.1'),
Requirement.parse('cffi!=1.11.3,>=1.7')]

现在,如果你想生成一个需求字符串列表(比如当你想为 pip 生成一个需求文件时),将需求转换为字符串:

In [8]: os.linesep.join(str(r) for r in dist.requires())
Out[8]:
'idna>=2.1\nasn1crypto>=0.21.0\nsix>=1.4.1\ncffi!=1.11.3,>=1.7'

PEP 508

如果你也想拿PEP 508 environment markers考虑到独立于当前平台,事情可能会变得有点棘手,但仍然可以管理。首先,使用 env 标记转换需求:

In [22]: dep_map_pep508 = {k: v for k, v in dist._build_dep_map().items() if k and k.startswith(':')}

In [24]: reqs_pep508 = [str(r) + ';' + k.lstrip(':') for k, v in dep_map_pep508.items() for r in v]

In [25]: reqs_pep508
Out[25]:
["cffi>=1.7;platform_python_implementation != 'PyPy'",
"enum34;python_version >= '3'",
"ipaddress;python_version >= '3'"]

现在处理独立于平台的依赖,这些位于 dist 的依赖映射中的 None 键下:

In [26]: reqs_no_platform = [str(r) for r in dist._build_dep_map()[None]]

In [27]: reqs_no_platform
Out[27]: ['idna>=2.1', 'asn1crypto>=0.21.0', 'six>=1.4.1', 'cffi!=1.11.3,>=1.7']

将两个列表组合成一个字符串,准备写入需求文件:

In [28]: os.linesep.join(reqs_no_platform + reqs_pep508)
Out[28]: "idna>=2.1\nasn1crypto>=0.21.0\nsix>=1.4.1\ncffi!=1.11.3,>=1.7\ncffi>=1.7;platform_python_implementation != 'PyPy'\nenum34;python_version >= '3'\nipaddress;python_version >= '3'"

关于python - 如何从 Python 包的 requires.txt 中读取依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50130706/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com