我正在开发一个需要系统包管理器的脚本。我使用os.uname()
函数确定了Fedora,Gentoo和Arch Linux。
但是,(开放)SUSE uname
结果与其他Linux发行版相同。我在Wikipedia找到了许多发行版的uname
结果。
有没有聪明的方法可以用Python识别(打开)SUSE?
答案 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)
来自顶部的评论:
我建议你直接解决实际问题。不是识别操作系统,而是确定可用的包管理器。
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
持有包数据库;这是dpkg
或apt-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
命令为分发提供了一些统一的输出。如果没有,那么这将不起作用。