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

时间:2012-06-17 19:01:21

标签: python opensuse suse identification uname

我正在开发一个需要系统包管理器的脚本。我使用os.uname()函数确定了Fedora,Gentoo和Arch Linux。

但是,(开放)SUSE uname结果与其他Linux发行版相同。我在Wikipedia找到了许多发行版的uname结果。

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

4 个答案:

答案 0 :(得分:7)

如果分布在Linux Standard Base之后,您可以阅读lsb_release -i的输出。

这样的事情:

import os

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

答案 1 :(得分: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"

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

apt-get已移植到Red Hat系统,通过名为alien的程序,您可以在Debian系统上获得rpm,依此类推。检测包数据库本身是确定正在使用的包系统的最简单方法。

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

答案 2 :(得分:1)

这一点Python样板文件将打印出您的平台信息:

import platform  

print platform.linux_distribution()  
('openSUSE ', '11.4', 'x86_64')  

应该做的。

答案 3 :(得分:0)

os.uname()的输出:

('Linux',
 'i7',
 '2.6.32-41-generic',
 '#90-Ubuntu SMP Tue May 22 11:31:25 UTC 2012',
 'i686')

uname -a命令应该为您提供大部分相同的信息。

% uname -a
Linux i7 2.6.32-41-generic #90-Ubuntu SMP Tue May 22 11:31:25 UTC 2012 i686 GNU/Linux

然后

distr = os.popen('uname -a').read().split()

给你:

['Linux',
 'i7',
 '2.6.32-41-generic',
 '#90-Ubuntu',
 'SMP',
 'Tue',
 'May',
 '22',
 '11:31:25',
 'UTC',
 '2012',
 'i686',
 'GNU/Linux']

您可以选择所需的相关字段。

我假设uname -a命令为分发提供了一些统一的输出。如果没有,那么这将不起作用。