おもこん

おもこんは「思いつくままにコンピュターの話し」の省略形です

Python初級者のお勉強ノート(13)osモジュール

これからしばらくは、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
    現在のOSを示す文字列。例えば、'posix'(Linux, macOS)、'nt'(Windows)。

  • os.sep
    パスの区切り文字。例えば、'/'(Unix系)、'\'(Windows)。

>>> 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スクリプトから簡単にシステム操作が可能です。本記事では以下を学びました。

  1. osモジュールの概要と基本的な使い方
  2. ファイル操作、ディレクトリ操作、環境変数の操作
  3. 実用的な例を通じたosモジュールの応用方法

これ以外にもosモジュールは多くの機能を持っていますので、OSの機能を使いたいときは、まず‘os`モジュールのドキュメントを調べてください。