6

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

但是,(打开的)SUSEuname结果与其他 Linux 发行版相同。我在Wikipediauname上找到了许多发行版的结果。

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

4

4 回答 4

8

从顶部的评论:

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

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

import os

if os.path.exists('/usr/bin/zypper'):
    ... # do the SUSE case
elif os.path.exists('/usr/bin/apt-get'):
    ... # do the Debian/Ubuntu case
elif os.path.exists('/usr/bin/yum'):
    ... # do the Red Hat case
else:
    raise OSError, "cannot find a usable package manager"

编辑:虽然这里的代码显示检测包管理器程序,但检测主包注册表本身可能会更好。例如,在使用 的 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 的发行版上运行。

于 2012-06-17T21:22:28.113 回答
7

如果发行版遵循Linux Standard Base,您可以阅读lsb_release -i的输出。

像这样的东西:

import os

try:
    distro = os.popen('lsb_release -i').read().split(':')[1].strip()
except IndexError:
    distro = None
于 2012-06-17T19:32:32.167 回答
1

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

import platform  

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

应该做的工作。

于 2012-06-22T19:41:30.843 回答
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命令为分布提供了一些统一的输出。如果没有,那么这将不起作用。

于 2012-06-17T19:28:32.870 回答