识别操作系统是否是Python中的(开放)SUSE?

ant*_*isk 6 python suse opensuse uname identification

我正在开发一个需要系统包管理器的脚本.我已经使用该os.uname()功能识别了Fedora,Gentoo和Arch Linux .

但是,(打开)SUSE uname结果与其他Linux Distros相同.我uname维基百科上发现了许多发行版的结果.

有没有什么聪明的方法可以用Python识别(打开)SUSE?

ʇsә*_*ɹoɈ 7

如果分发遵循Linux Standard Base,则可以读取lsb_release -i的输出.

像这样的东西:

import os

try:
    distro = os.popen('lsb_release -i').read().split(':')[1].strip()
except IndexError:
    distro = None
Run Code Online (Sandbox Code Playgroud)


ste*_*eha 6

从顶部的评论:

  • 我需要知道操作系统是否(开放)SUSE以便使用正确的软件包安装程序(zypper).如果是DEBIAN(例如),我将使用apt-get ...

我建议你直接解决实际问题.不是识别操作系统,而是识别可用的包管理器.

import os
def file_exists(fname):
    try:
        os.stat(fname)
        return True
    except OSError:
        return False


if file_exists('/usr/bin/zypper'):
    ... # do the SUSE case
elif file_exists('/usr/bin/apt-get'):
    ... # do the Debian/Ubuntu case
elif file_exists('/usr/bin/yum'):
    ... # do the Red Hat case
else:
    raise OSError, "cannot find a usable package manager"
Run Code Online (Sandbox Code Playgroud)

编辑:虽然这里的代码显示检测包管理器程序,但检测主程序包注册表本身可能更好.例如,在使用的Debian/Ubuntu系统上dpkg,将有一个/var/lib/dpkg包含数据包数据库的目录; 这是一个确定的标志,dpkg或者apt-get是适当的.我不知道SUSE和Red Hat的等效目录是什么,但是如果你支持那些你可以找到的.

apt-get已被移植到Red Hat系统,并通过一个名为alien你的程序可以rpm访问Debian系统,等等.检测包数据库本身是确定正在使用的包系统的最简单方法.

如果您检测到包管理器,那么您的代码将自动处理所有相关的发行版.如果您检测到dpkg数据库,您的代码将适用于Debian,Ubuntu,Linux Mint以及基于Debian的许多其他发行版.如果您检测到rpm数据库,您的代码将适用于Red Hat,Centos,Fedora,Mandriva以及基于RPM的所有其他发行版.