我需要依赖项,因为我想将这些添加到我的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如何读取所有依赖项,计算[]之间的表达式
我正在使用Python2.7(不要问)
我需要以下输出:
idna>=2.1
asn1crypto>=0.21.0
six>=1.4.1
cffi>=1.7
enum34
ipaddress我想省略其他部分,如[doc],[test]等。
发布于 2018-05-05 20:13:05
requires.txt是依赖元数据的一部分,所以您可以使用easy_install在安装鸡蛋时使用的相同工具。假设文件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')]如果我使用Python2.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'佩普508
如果您还想考虑独立于当前平台的PEP 508环境标志,事情可能会变得更加棘手,但仍然是可管理的。首先,使用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'"]现在处理与平台无关的dep,这些房子在None的dist依赖映射中的键下:
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'"发布于 2018-05-05 13:50:11
因此,我能够为同样的问题找到一个可行的解决方案,可能还有其他的可能性,但我认为这在大多数版本中都是可行的。
import pkg_resources
lines = open("requirements.txt").readlines()
load_packages = True
for line in lines:
if line.strip().startswith("#"):
continue
if line.startswith("[:"):
# this is marker, let's evaluate
load_packages = pkg_resources.evaluate_marker(line.strip()[2:-1])
continue
elif line.startswith("["):
# this is a subsection ignore it
load_packages = False
if load_packages and line.strip():
print(line.strip())它的输出如下
idna>=2.1
asn1crypto>=0.21.0
six>=1.4.1
cffi>=1.7
enum34
ipaddress如果我像下面这样更改requirements.txt
idna>=2.1
asn1crypto>=0.21.0
six>=1.4.1
[:platform_python_implementation == 'PyPy']
cffi>=1.7
[:python_version > '3']
enum34
ipaddress输出更改为
idna>=2.1
asn1crypto>=0.21.0
six>=1.4.1发布于 2018-05-05 22:20:01
您可以测试每一行的开头是否与pip依赖关系声明格式匹配。
Regex可能是模式匹配的最佳解决方案:
pattern = r'^[\w\d_-]+'其中:
^匹配行/文件的开头[\w\d_-]+多次匹配任何单词(\w)、数字(\d)、下划线(_)和破折号(-)。总而言之:
from re import match
pattern = r'^[\w\d_-]+'
with open('requires.txt') as file:
for line in file:
if match(pattern, line):
print(line.strip())结果:
$ python2.7 test.py
idna>=2.1
asn1crypto>=0.21.0
six>=1.4.1
cffi>=1.7
enum34
ipaddresshttps://stackoverflow.com/questions/50130706
复制相似问题