检查软件包或版本是否存在并获取发布版本号
import pandas as pd
import subprocess
import re
import sys
def parse_release(release_str):
"""解析release字符串,提取整数部分"""
if not release_str:
return 0
# 仅匹配开头的数字部分
match = re.match(r'^(\d+)', release_str)
return int(match.group(1)) if match else 0
def check_repoquery():
"""检查repoquery命令是否可用"""
try:
subprocess.run(['repoquery', '--version'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=True)
return True
except (subprocess.SubprocessError, FileNotFoundError):
return False
def main():
# 检查依赖命令
if not check_repoquery():
print("错误: 未找到'repoquery'命令,请确保yum-utils已安装。")
return
print("正在读取 package.xlsx 文件...")
try:
df = pd.read_excel('package.xlsx')
print("成功读取 package.xlsx 文件。")
except FileNotFoundError:
print("错误: 找不到 package.xlsx 文件")
return
except Exception as e:
print(f"读取文件失败: {str(e)}")
return
result = []
separator = "=" * 30
for index, row in df.iterrows():
pkg_name = None
for field in ['软件名', '包名', '软件名称', 'package_name']:
if field in row:
pkg_name = str(row[field])
break
version = None
for field in ['版本号', '版本', 'version']:
if field in row:
version = str(row[field])
break
if pkg_name is None or version is None:
missing = []
if pkg_name is None:
missing.append("软件名/包名")
if version is None:
missing.append("版本/版本号")
print(f"错误: 第{index+1}行未找到{', '.join(missing)}字段")
continue
print(f"正在检查 {pkg_name} {version}...")
latest_release = None
exists = False
version_match = False
cmd = ['repoquery', '-q', '--qf', '%{VERSION}-%{RELEASE}', pkg_name]
try:
output = subprocess.check_output(cmd, text=True, timeout=10, stderr=subprocess.STDOUT)
packages = [line.strip() for line in output.split('\n') if line.strip()]
if not packages:
exists = False
print(f"{pkg_name} 不存在于 yum 源中")
else:
exists = True
print(f"找到 {len(packages)} 个相关包")
for pkg in packages:
try:
ver_part, rel_part = pkg.rsplit('-', 1)
if ver_part == version:
version_match = True
rel_num = parse_release(rel_part)
if latest_release is None or rel_num > latest_release:
latest_release = rel_num
except ValueError:
print(f"警告: 包 {pkg} 格式异常,跳过")
continue
print(f"{'匹配到' if version_match else '未匹配到'} 版本 {version}")
if version_match:
print(f"最新 release 号: {latest_release}")
except subprocess.TimeoutExpired:
exists = False
print(f"查询超时: {pkg_name}")
except subprocess.CalledProcessError as e:
exists = False
print(f"查询失败: {e.output.strip()}")
except Exception as e:
exists = False
print(f"未知错误: {str(e)}")
result.append({
'软件名': pkg_name,
'版本': version,
'是否存在': '是' if exists else '否',
'是否匹配': '匹配' if version_match else '不匹配',
'最新release号': latest_release if version_match else 'N/A'
})
print(separator)
# 优化后的控制台表格输出
print("\n================================= 查询结果汇总 =================================")
print("{:<17}{:<14}{:<9}{:<12}{:<10}".format(
"软件名", "版本", "是否存在", "是否匹配", "最新release号"
))
print("-" * 80) # 调整分隔线长度
for item in result:
print("{:<20}{:<16}{:<12}{:<14}{:<16}".format(
item['软件名'],
item['版本'],
item['是否存在'],
item['是否匹配'],
str(item['最新release号'])
))
print("-" * 80) # 调整分隔线长度
# 保存结果到Excel
try:
pd.DataFrame(result).to_excel('out.xlsx', index=False)
print("\n结果已保存到 out.xlsx")
except Exception as e:
print(f"保存失败: {str(e)}")
if __name__ == "__main__":
main()
excel示例
| 软件名 | 版本 |
|---|---|
| tar | 1.35 |
| autoconf | 2.71 |
| automake | 1.16.5 |
作者:wanghongwei
版权声明:本作品遵循<CC BY-NC-ND 4.0>版权协议,商业转载请联系作者获得授权,非商业转载请附上原文出处链接及本声明。

浙公网安备 33010602011771号