在 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 保存包数据库;这肯定表明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 的发行版上运行。

【讨论】:

谢谢!这就是我需要的! 这里的问题是有些包有不同的名字或者根本不可用。这就是为什么我仍然需要 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?的主要内容,如果未能解决你的问题,请参考以下文章

python识别文言文

Python:在语音识别中获取系统音频而不是麦克风

python智能停车场车牌识别计费系统百度ai

系统梳理OpenCV图像识别等资料免费开放,仅此1天!

Python调用人工智能识别表格

神目AI开放平台 新添免费表情识别,车牌识别,安全帽识别SDK