在 Python 中识别操作系统是不是是(开放)SUSE?
Posted
技术标签:
【中文标题】在 Python 中识别操作系统是不是是(开放)SUSE?【英文标题】:Identifying If the OS is (Open)SUSE in Python?在 Python 中识别操作系统是否是(开放)SUSE? 【发布时间】:2012-06-19 21:36:38 【问题描述】:我正在开发一个需要系统包管理器的脚本。我已经使用 os.uname()
函数识别了 Fedora、Gentoo 和 Arch Linux。
但是,(打开的)SUSE uname
结果与其他 Linux 发行版相同。我在Wikipedia 上找到了许多发行版的uname
结果。
有什么聪明的方法可以用 Python 识别(打开)SUSE 吗?
【问题讨论】:
这首先使用起来很危险。你的实际问题是什么?您不能只检查您需要的特定功能吗? 我需要知道操作系统是否是 (Open)SUSE 以便使用正确的软件包安装程序 (zypper)。如果是DEBIAN(例如),我会使用apt-get...这就是为什么我需要这个.... CristopheD,我认为您的回答涵盖了我的需要!谢谢!!! 我认为@hop的意思是,检查哪个包管理器可用,而不是从主机操作系统推断它不是更好吗? @ChristopheD 您应该非常小心虚拟化环境中的 /proc/version。首先,那里是 gcc 版本。其次,您可能会看到主机的内核版本可能来自不同的发行版。 【参考方案1】: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
命令为分布提供了一些统一的输出。如果没有,那么这将不起作用。
【讨论】:
为什么投反对票?我很乐意纠正任何错误或改进答案,或者撤回它,但我需要知道感知到的问题是什么首先。 1. Suse 在 uname -a 中没有它的名字 @unbeli 我很欣赏第一条评论(SUSE 为uname -a
显示什么)?,您的第二条评论很粗鲁而且不合时宜。
对于 OpenSUSE uname -a,google 一个示例并不难:Linux pax22 3.1.0-1.2-default #1 SMP Thu Nov 3 14:45:45 UTC 2011 (187dde0) i686 i686 i386 GNU/Linux。如您所见,没有任何分布迹象,因此您的答案有点行不通。对不起。
SUSE 和许多其他 Unix 发行版具有相同的 uname -a 输出!【参考方案2】:
如果分布遵循Linux Standard Base,您可以读取lsb_release -i的输出。
类似这样的:
import os
try:
distro = os.popen('lsb_release -i').read().split(':')[1].strip()
except IndexError:
distro = None
【讨论】:
是的,这对我的脚本很有帮助!【参考方案3】:来自顶部的 cmets:
我需要知道操作系统是否为 (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"
编辑:虽然这里的代码显示检测包管理器程序,但检测主包注册表本身可能会更好。例如,在使用 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 的发行版上运行。
【讨论】:
谢谢!这就是我需要的! 这里的问题是有些包有不同的名字或者根本不可用。这就是为什么我仍然需要 distri 名称。但尽管如此 - 如果脚本找到 zypper,它可能是 SuSE,所以谢谢你;)【参考方案4】:这一点 Python 样板将打印出您的平台信息:
import platform
print platform.linux_distribution()
('openSUSE ', '11.4', 'x86_64')
应该做的工作。
【讨论】:
今天,2020/04/05:AttriubuteError:模块“平台”没有属性“linux_distribution”。这很奇怪,我认为它曾经有过这个属性。但即使使用 uname -a,也不再提示底层系统是 SuSE。以上是关于在 Python 中识别操作系统是不是是(开放)SUSE?的主要内容,如果未能解决你的问题,请参考以下文章