これからしばらくは、Pythonの標準モジュールのうち、良く使われるものについて、その使い方を見ていきます。
どの言語でもそうですが、言語そのものだけでは不十分で、言語の提供するモジュール、あるいはライブラリが必要不可欠です。
今回の記事では、Pythonのos
モジュールの基本と活用方法を学びます。
Pythonのos
モジュールは、オペレーティングシステムとのやり取りを可能にする標準モジュールです。
Pythonは、Windows、MacOS、Linux、FreeBSDなど様々なOSの上で動いています。
Pythonは、これらのOS間に違いをカバーし、できるだけ標準的な手続きでアクセスするためのモジュールとしてos
を用意しています。
このモジュールは、OSの提供するサービス、すなわち、ファイルやディレクトリ操作、環境変数の取得・設定、プロセス管理など、多くのシステム関連タスクをサポートします。
osモジュールの概要
os
モジュールは、Pythonプログラムが実行環境のOS(Windows, macOS, Linuxなど)と対話するための便利なインターフェースを提供します。
例えば、以下のようなタスクを簡単に実現できます。
モジュールを利用するには、Pythonプログラムで以下のようにインポートします。
import os
osモジュールの主要な関数、メソッド、定数
ここでは、よく使われるos
モジュールの関数と定数について説明します。
プログラム例では、すでにos
モジュールがインポートされているものとします。
ファイルとディレクトリの操作
os.getcwd()
現在の作業ディレクトリを取得します。
>>> os.getcwd()
'/home/user/project'
os.chdir(path)
作業ディレクトリを変更します。
>>> os.chdir('/tmp') >>> os.getcwd() '/tmp'
os.listdir(path)
指定されたディレクトリ内のファイルやフォルダの一覧を取得します。
>>> os.listdir('.') ['file1.txt', 'dir1', 'script.py']
os.mkdir(path)
新しいディレクトリを作成します。
>>> os.mkdir('new_dir') >>> os.listdir('.') ['file1.txt', 'dir1', 'script.py', 'new_dir']
os.remove(path)
ファイルを削除します。
>>> os.remove('file1.txt')
os.rmdir(path)
空のディレクトリを削除します。
>>> os.rmdir('new_dir')
os.path
モジュールとの連携
os
モジュールの一部であるos.path
には、パス操作に便利な関数が多く含まれています。
>>> os.path.exists('file1.txt') # ファイルが存在するかチェック True >>> os.path.isabs('/tmp/file1.txt') # 絶対パスかどうか True >>> os.path.join('/tmp', 'file1.txt') # パスを結合 '/tmp/file1.txt'
環境変数の操作
os.getenv(key, default=None)
環境変数の値を取得します。
>>> os.getenv('HOME') '/home/user'
os.environ
環境変数の一覧を持つマップ型オブジェクトです。 辞書型のようにアクセスすることができます。
>>> os.environ["HOMEDRIVE"] 'C:' >>>
これは、WIndowsの例です。Linuxではこのような結果にはならないと思います。
また、環境変数を追加することもできます。
>>> os.environ['MY_VAR'] = 'value' >>> os.getenv('MY_VAR') 'value'
os.putenv(key, value)
でも環境変数を追加することができます。
実は上記のos.environ
による環境変数の追加時には、os.putenv
が使われているのです。
もし、直接os.putenv
を使って環境変数を追加すると、os.environ
にそれは反映されません。
ですから、os.environ
の直接操作の方が推奨されています。
定数
次の2つは定数です。 値をユーザが変更することはできません。
>>> os.name 'posix' >>> os.sep '/'
プロセスの操作
Pythonのos
モジュールでは、以下のようにプロセスに関連する操作を行うことができます。
これらは低レベル(OSに近いレベル)のメソッドであり、使う機会はあまりありません。
ですから、初級者にとっては、必要な時にチェックする程度で良いでしょう。
os.getpid()
現在のプロセスIDを取得します。
>>> os.getpid() 12345 # 実行中のプロセスID
os.getppid()
現在のプロセスを生成した親プロセスのIDを取得します。
>>> os.getppid() 6789 # 親プロセスのID
os.fork()
UNIX系OSで新しいプロセスを生成します(Windowsでは使用不可)。
この関数を使うと、現在のプロセスが複製され、親プロセスと子プロセスの2つのプロセスが並行して実行されます。
pid = os.fork() if pid == 0: # 子プロセス print("子プロセス") else: # 親プロセス print(f"親プロセス (子プロセスのID: {pid})")
os.execl()
, os.execv()
, os.execvp()
現在のプロセスを置き換える形で、指定した新しいプログラムを実行します。
例えば、以下は新しいプログラムに置き換える例です。
os.execl('/bin/ls', 'ls', '-l') # lsコマンドを実行
os.kill(pid, signal)
指定したプロセスIDにシグナルを送ります。プロセスを終了させたり、特定のシグナルを処理させるのに使います。
import signal os.kill(12345, signal.SIGTERM) # プロセス12345を終了
システム情報の取得
os
モジュールは、システムに関する情報を取得するための関数を提供しています。これらの機能を活用することで、スクリプトの実行環境を動的に確認したり、それに応じた動作を実現できます。
os.name
現在のOSを表す文字列を取得します。
>>> os.name 'posix' # 例: Linux環境での出力
os.uname()
システム情報を表すオブジェクトを取得します(Windowsでは使用不可)。
以下の属性を持つオブジェクトが返されます。
sysname
: OSの名前nodename
: ネットワーク名release
: OSリリース番号version
: OSバージョンmachine
: ハードウェア名
>>> os.uname() posix.uname_result(sysname='Linux', nodename='hostname', release='5.4.0', version='#42-Ubuntu SMP', machine='x86_64')
os.getenv()
環境変数の値を取得します。HOME
やPATH
などの環境変数の値を調べるのに便利です。
>>> os.getenv('HOME') # ユーザーのホームディレクトリ '/home/user'
osモジュールの典型的な使い方
一時ディレクトリの操作
一時的なファイルを扱う場合、tempfile
モジュールと組み合わせることが一般的ですが、os
モジュールだけでも十分に実現可能です。
import os temp_dir = 'my_temp_dir' # 一時ディレクトリを作成 if not os.path.exists(temp_dir): os.mkdir(temp_dir) # 作業ディレクトリを移動 os.chdir(temp_dir) print(f"現在の作業ディレクトリ: {os.getcwd()}")
osモジュールを使った実用的な例
ファイルのバックアップスクリプト
次のスクリプトは、指定されたディレクトリ内のすべてのファイルをバックアップ用ディレクトリにコピーします。 ただし、一般ファイル以外(例えばディレクトリ)はコピーしません。
import os import shutil def backup_files(src_dir, backup_dir): # バックアップディレクトリが存在しなければ作成 if not os.path.exists(backup_dir): os.mkdir(backup_dir) # ファイルをバックアップ for f in os.listdir(src_dir): src_path = os.path.join(src_dir, f) backup_path = os.path.join(backup_dir, f) if os.path.isfile(src_path): shutil.copy(src_path, backup_path) print(f"{f} をバックアップしました") # 使用例 src = '.' backup = 'temp' backup_files(src, backup)
システム情報の取得
システムに関する情報を取得する小さなツールを作成します。
import os def print_system_info(): print(f"OS名: {os.name}") print(f"カレントディレクトリ: {os.getcwd()}") print(f"ホームディレクトリ: {os.getenv('HOME')}") print_system_info()
まとめ
os
モジュールを使うと、Pythonスクリプトから簡単にシステム操作が可能です。本記事では以下を学びました。
これ以外にもos
モジュールは多くの機能を持っていますので、OSの機能を使いたいときは、まず‘os`モジュールのドキュメントを調べてください。