参考链接:python-rpm-spec · PyPI
安装模块先使用 pip 安装 python-rpm-spec 模块
pip3 install python-rpm-spec使用示例
test.spec
Name: pandas
Version: 0.25.3
Release: 2
Summary: Data structures and data analysis tools for Python
License: BSD
URL: https://pandas.pydata.org/
Source0: https://github.com/pandas-dev/pandas/releases/download/v%{version}/%{pypi_name}-%{version}.tar.gz
BuildRequires: gcc gcc-c++ gdb-headless
BuildRequires: python3-devel python3-setuptools python3-numpy
%if %{with test}
BuildRequires: python3-pytest >= 4.0.2
%endif
Requires: python3-numpy python3-dateutil python3-pytz
Conflicts: conflicts-test
Provides: provides-test
Obsoletes: obsoletes-test
test.py
# pip3 install python-rpm-spec
from pyrpm.spec import Spec
spec_path = 'test.spec'
spec = Spec.from_file(spec_path)
print('Name:'.ljust(20), spec.name)
print('Version:'.ljust(20), spec.version)
print('Release:'.ljust(20), spec.release)
print('Summary:'.ljust(20), spec.summary)
print('License:'.ljust(20), spec.license)
print('URL:'.ljust(20), spec.url)
print('Source0:'.ljust(20), spec.sources[0])
print('Requires:'.ljust(20), spec.requires)
print('BuildRequires:'.ljust(20), spec.build_requires)
print('Provides:'.ljust(20), spec.provides)
print('Conflicts:'.ljust(20), spec.conflicts)
print('Obsoletes:'.ljust(20), spec.obsoletes)
print('SourceList:'.ljust(20), spec.sources)
print('SourceDict:'.ljust(20), spec.sources_dict)
# build_requires = []
# for br in spec.build_requires:
# build_requires.append(f'{br.name} {br.operator} {br.version}' if br.version else f'{br.name}')
# print('BuildRequires:'.ljust(20), build_requires)
result
Name: pandas
Version: 0.25.3
Release: 2
Summary: Data structures and data analysis tools for Python
License: BSD
URL: https://pandas.pydata.org/
Source0: https://github.com/pandas-dev/pandas/releases/download/v%{version}/%{pypi_name}-%{version}.tar.gz
Requires: [python3-numpy, python3-dateutil, python3-pytz]
BuildRequires: [gcc, gcc-c++, gdb-headless, python3-devel, python3-setuptools, python3-numpy, python3-pytest >= 4.0.2]
Provides: [provides-test]
Conflicts: [conflicts-test]
Obsoletes: [obsoletes-test]
SourceList: ['https://github.com/pandas-dev/pandas/releases/download/v%{version}/%{pypi_name}-%{version}.tar.gz']
SourceDict: {'Source0': 'https://github.com/pandas-dev/pandas/releases/download/v%{version}/%{pypi_name}-%{version}.tar.gz'}
其他字段
当然,如果你好奇心更严重一点,或许可以从 spec.py 的源码文件看出,它其实也是使用的正则匹配去获取 spec 文件对应的这些内容的,只不过通过封装添加了一些额外的处理,下面展示了一些其他可能的字段。
_tags = [
_Namevalue("name", re_tag_compile(r"^Names*:s*(S+)")),
_Namevalue("version", re_tag_compile(r"^Versions*:s*(S+)")),
_Namevalue("epoch", re_tag_compile(r"^Epochs*:s*(S+)")),
_Namevalue("release", re_tag_compile(r"^Releases*:s*(S+)")),
_Namevalue("summary", re_tag_compile(r"^Summarys*:s*(.+)")),
_Namevalue("description", re_tag_compile(r"^%descriptions*(S*)")),
_Namevalue("changelog", re_tag_compile(r"^%changelogs*(S*)")),
_Namevalue("license", re_tag_compile(r"^Licenses*:s*(.+)")),
_Namevalue("group", re_tag_compile(r"^Groups*:s*(.+)")),
_Namevalue("url", re_tag_compile(r"^URLs*:s*(S+)")),
_Namevalue("buildroot", re_tag_compile(r"^BuildRoots*:s*(S+)")),
_SplitValue("buildarch", re_tag_compile(r"^BuildArchs*:s*(S+)")),
_SplitValue("excludearch", re_tag_compile(r"^ExcludeArchs*:s*(.+)")),
_SplitValue("exclusivearch", re_tag_compile(r"^ExclusiveArchs*:s*(.+)")),
_ListAndDict("sources", re_tag_compile(r"^(Sourced*s*):s*(.+)")),
_ListAndDict("patches", re_tag_compile(r"^(Patchd*s*):s*(S+)")),
_List("build_requires", re_tag_compile(r"^BuildRequiress*:s*(.+)")),
_List("requires", re_tag_compile(r"^Requiress*:s*(.+)")),
_List("conflicts", re_tag_compile(r"^Conflictss*:s*(.+)")),
_List("obsoletes", re_tag_compile(r"^Obsoletess*:s*(.+)")),
_List("provides", re_tag_compile(r"^Providess*:s*(.+)")),
_List("packages", re.compile(r"^%packages+(S+)")),
_MacroDef("define", re.compile(r"^%defines+(S+)s+(S+)")),
_MacroDef("global", re.compile(r"^%globals+(S+)s+(S+)")),
_DummyMacroDef("dummy", re.compile(r"^%[a-z_]+b.*$")),
]



