システムのパッケージ マネージャーを必要とするスクリプトを開発しています。この関数を使用して、Fedora、Gentoo、および Arch Linux を特定しましたos.uname()
。
ただし、(open)SUSEuname
の結果は、他の Linux ディストリビューションと同じです。ウィキペディアuname
で多くのディストリビューションの結果を見つけました。
Python で SUSE を (オープンに) 識別するスマートな方法はありますか?
上のコメントから:
実際の問題を直接解決することをお勧めします。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 などの同等のディレクトリが何かはわかりませんが、それらをサポートしている場合は見つけることができます。dpkg
apt-get
apt-get
は Red Hat システムに移植されており、you と呼ばれるプログラムを介してDebian システムでalien
入手できます。rpm
パッケージ データベース自体を検出することは、使用中のパッケージ システムを特定する最も簡単な方法です。
パッケージ マネージャーを検出すると、コードは関連するすべてのディストリビューションで自動的に機能します。データベースを検出する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
このコマンドは、ディストリビューションに対してある程度均一な出力を提供すると想定しています。そうでない場合、これは機能しません。