我正在开发一个需要系统包管理器的脚本。os.uname()
我已经使用该函数识别了 Fedora、Gentoo 和 Arch Linux 。
但是,(打开的)SUSEuname
结果与其他 Linux 发行版相同。我在Wikipediauname
上找到了许多发行版的结果。
有什么聪明的方法可以用 Python 识别(打开)SUSE 吗?
从顶部的评论:
我建议你直接解决实际问题。不是识别操作系统,而是识别可用的包管理器。
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 的发行版上运行。
如果发行版遵循Linux Standard Base,您可以阅读lsb_release -i的输出。
像这样的东西:
import os
try:
distro = os.popen('lsb_release -i').read().split(':')[1].strip()
except IndexError:
distro = None
这一点 Python 样板将打印出您的平台信息:
import platform
print platform.linux_distribution()
('openSUSE ', '11.4', 'x86_64')
应该做的工作。
输出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
命令为分布提供了一些统一的输出。如果没有,那么这将不起作用。