Pythonで現在のOSを判別する方法 - Windows / Linux / macOS のどれか判定する方法

作成日:

本記事ではPythonを利用して、現在スクリプトを実行しているOSが果たしてWindowsか、Linuxか、はたまたmacOSであるのかを検出する方法について記載します。

Pythonはクロスプラットフォームで動作するため、OSに関係なく動作する便利ツールとして大変便利です。しかし、OSに依存した機能を利用する場合(OSに固有の機能を利用する時、あるいはOS毎に配布方法の異なるソフトを利用するなど)や、OS毎に挙動を変えたい場合(ファイル名の規則や保管場所がOS毎に異なるなど)にはOSを判定したい時があります。

そういった場合にPythonでどのような記述をすればOSがチェックできるかを本記事では記載しています。

本記事は Python 3.10.6 で確認しています。

方法#

方法1: わかりやすいOS名を取得する その1#

これが最も直観的にわかりやすい名称を得られると思います。 macOSはDarwinと表示されますが、実はこっちがベースのOSの名称らしいです[1]

import platform

os_name = platform.system()
if os_name == 'Windows':
    print('Windows')
elif os_name == 'Linux':
    print('Linux')
elif os_name == 'Darwin':
    print('macOS')

方法2: わかりやすいOS名を取得する その2#

方法1よりは若干わかりづらい名称になる気がします。 Windows がなぜか win32 だったり。

import sys

os_name = sys.platform
if os_name == 'win32':
    print('Windows')
elif os_name == 'linux':
    print('Linux')
elif os_name == 'darwin':
    print('macOS')

方法3: 詳細なバージョン情報まで取得する#

OSのバージョン情報まで取得したい場合にはこの方法が網羅的で良いかと思われます。

import platform

print(platform.uname())

上記の print 文の結果を下記に掲載します。 node は端末の名称であるため隠しています。

# => Windows 10 の場合
uname_result(system='Windows', node='******', release='10', version='10.0.19044', machine='AMD64')

# => ubuntu の場合
uname_result(system='Linux', node='******', release='5.4.0-126-generic',
             version='#142-Ubuntu SMP Fri Aug 26 12:12:57 UTC 2022', machine='x86_64')

# => macOSの場合
uname_result(system='Darwin', node='******', release='21.5.0',
             version='Darwin Kernel Version 21.5.0: Tue Apr 26 21:08:22 PDT 2022; root:xnu-8020.121.3~4/RELEASE_X86_64',
             machine='x86_64', processor='i386')

説明#

OSの情報を取得するための関数は sys , platform といったモジュールに存在します。幾つか似たような関数や変数が定義されているため、以下にそれぞれの特徴を解説します。

わかりやすいOS名を取得する platform.system()#

platform.system() は普段私たちが目にするような名称 ( Windows , Linux , Darwin など ) でプラットフォームの名前を返してくれます。

ドキュメントを見ても網羅的な記述がなされていないのですが、ソースコードを確認したところ本関数は 方法3 として記載した platform.uname() の結果の中の system の値だけを取り出して返してくれているようです。

詳細は後述の 詳細なOS名を取得する platform uname の項目をご確認ください。

わかりやすめのOS名を取得できる sys.platform#

sys.platformplatform.system() と似たようにわかりやすい名前を出してくれますが、内容が異なります。

内部の実装を調べてみたところ、 Python 3.10.6 時点では uname -r の結果を小文字にして出力しているもののようです。Windowsでは uname コマンドが存在しないため、Windowsの場合にのみ特別に必ず win32 という文字列が与えられるようです。

上記でリンクしているマニュアルに掲載されているように、Pythonのバージョンによって一部内容が異なるため取り扱い注意です。

ちなみに、この変数に格納されている値はビルド時に設定されたもののようです ( Python本体のリポジトリ configure.ac と sysモジュールの実装である cpython/Python/sysmodule.c あたりを参照) 。

詳細なOS名を取得する platform.uname()#

platform.uname() はその名の通り uname コマンドの値を返してくれる関数です。Pythonの内部実装的には os.uname を呼び出しているようです。

Windowsでは uname コマンドが存在しないため、ここでも特別に他の方法で値を取得しています。

以下のような場合にこちらの方法が活用できそうです。

  • Linuxのディストリビューションを判定したい場合

  • OSの詳細なバージョンを知りたい場合

  • 利用しているCPUアーキテクチャを知りたい場合

Python
CrossPlatform