6

システムのパッケージ マネージャーを必要とするスクリプトを開発しています。この関数を使用して、Fedora、Gentoo、および Arch Linux を特定しましたos.uname()

ただし、(open)SUSEunameの結果は、他の Linux ディストリビューションと同じです。ウィキペディアunameで多くのディストリビューションの結果を見つけました。

Python で SUSE を (オープンに) 識別するスマートな方法はありますか?

4

4 に答える 4

8

上のコメントから:

  • 正しいパッケージ インストーラー (zypper) を使用するには、OS が (Open) SUSE かどうかを知る必要があります。DEBIAN の場合 (たとえば)、apt-get を使用します...

実際の問題を直接解決することをお勧めします。OS を特定する代わりに、利用可能なパッケージ マネージャーを特定します。

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であることの確かな兆候です。SUSE や Red Hat などの同等のディレクトリが何かはわかりませんが、それらをサポートしている場合は見つけることができます。dpkgapt-get

apt-getは Red Hat システムに移植されており、you と呼ばれるプログラムを介してDebian システムでalien入手できます。rpmパッケージ データベース自体を検出することは、使用中のパッケージ システムを特定する最も簡単な方法です。

パッケージ マネージャーを検出すると、コードは関連するすべてのディストリビューションで自動的に機能します。データベースを検出する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 に答える