Yamamoto's Laboratory
 
OS関係
  os
 
ファイル
 
数学・科学
 
出力
 
その他
 
 
コンピューター Python モジュール os

Pythonモジュール  os OS の雑多なインターフェース

Python で,ファイルとディレクトリーの操作を操作するための便利なモジュール os の使い方について説明します.

目次


はじめに

Python のようなスクリプト言語 (?) では,ディレクトリーやファイルの操作を行うことがしばしば有ります.その場合,モジュール os が便利です.例えば,以下のプログラムでカレントディレクトリーのファイル / ディレクトリー名を出力します.

カレントディレクトリーのファイル / ディレクトリー名を表示する(check_dir.py).

001   import os
002   
003   lists = os.listdir('./')
004   for li in lists:
005       if os.path.isdir(li):
006           print('directory: {0:s}'.format(li))
007       else:
008           print('file: {0:s}'.format(li))

モジュール os の機能

ここでは,モジュール os の重要な — 使用頻度が高いと思われる — 機能(主にメソッド)について,説明します.モジュール os はたくさんのメソッドや変数,クラスから構成され,とてもこの節で説明しきれません.そこで,今まであるいは今後,筆者が使うと思われる機能に絞ります.詳細が必要な場合は,マニュアル「os ― Miscellaneous operating system interfaces」を参照ください.本節の内容の多くは,このマニュアルを適当に日本語訳したものです.

プロセスパラメーター

ここで示す機能(一部はデータ)は,現在のプロセスおよびユーザに関する情報を提供するとともに、それらを操作も行います.

「os」のプロセスパラメーターに関する使用頻度の高い機能
メソッドなど 内容
os.environ 戻り値: 環境変数.
os.environb 戻り値: 環境変数.os.environ の改良版.
os.chdir(path) カレントディレクトリーを path に変更
os.fchdir(fd) ファイルディスクリプタ (fd) によって表されるディレクトリにカレントディレクトリを変更
os.getcwd() 戻り値: カレントディレクトリーの絶対パス
os.getenv(key, default=None) 戻り値: 環境変数「key」が有ればその値,無い場合 default
os.getenvb(key, default=None) 戻り値: 環境変数「key」が有ればその値,無い場合 default.Unix 互換環境で,supports_bytes_environ が True の場合のみ利用可能.
os.get_exec_path(env=None) 戻り値: プロセスを起動するときに、シェルに似た名前付き実行可能ファイルを検索するディレクトリのリスト.
os.getpid() 戻り値: カレントプロセス id
os.getppid() 戻り値: 親プロセス id
これら以外に様々な機能があります.残りはマニュアル「Process Parameters」(日本語)を参照.

ファイルオブジェクトの生成

新規にファイル作成する機能です.しかし,これを使う状況はめったに起きないでしょう.使う場合は,「File Object Creation」を読んでください.

ファイル記述子の操作

ここで示す機能(メソッド)は,ファイル記述子 (file descriptor) を使って参照される I/O ストリームを操作します.ファイル記述子は,現在のプロセスによって開かれたファイルに対応する小さな整数です.たとえば,標準入力の通常ファイル記述子は「0」,標準出力は「1」,標準エラーは「2」です.プロセスによって開かれたさらに別のファイルには,「3」や「4」,「5」というよな整数が割り当てられます.Unix 系の OS では,ソケットとパイプもファイル記述子によって参照されます.fileno() メソッドを使うと,必要に応じてファイルオブジェクトに関連付けられたファイル記述子を取得することができます. ファイル記述子を直接使用すると,ファイルオブジェクトメソッドをバイパスし,データの内部バッファリングなどの側面は無視します.

ファイルとディレクトリー

ファイルやディレクトリーの操作に関する機能です.

「os」のファイルとディレクトリーに関する使用頻度の高い機能
オブジェクト 内容
os.chdir(path) カレントディレクトリーの変更
os.getcwd() カレントワーキングディレクトリーの文字列を返す
os.listdir(path='.') path で指定したディレクトリ内のエントリ名(ファイル名やサブディレクトリー名)のリストを返す
os.mkdir(path, mode=0o777, *, dir_fd=None) path で指定したディレクトリーを mode で作成
os.remove(path, *, dir_fd=None) path で指定したファイルを削除.
os.removedirs(name) 再帰的にデレクトリを削除します.
os.rename(src, dst, *, src_dir_fd=None, dst_dir_fd=None) ファイルやディレクトリー名を src から dst に変更.対象の上書きがクロスプラットフォームになる場合は replace() を使うべき.
os.replace(src, dst, *, src_dir_fd=None, dst_dir_fd=None) ファイルまたはディレクトリ src の名前を dst へ変更
os.rmdir(path, *, dir_fd=None) path で指定された空のディレクトリーを削除
os.scandir(path='.') 戻り値: path で指定されたディレクトリ内のエントリに対応する os.DirEntry オブジェクトのイテレータ.os.DirEntry オブジェクト については,表を参照.
os.stat(path, *, dir_fd=None, follow_symlinks=True) 戻り値: ファイル及びディレクトリーのステータス.
os.unlink(path, *, dir_fd=None) ファイルを削除.os.remove() 同じ.
これら以外に様々な機能があります.残りはマニュアル「Files and Directories」(日本語)を参照.

os.DirEntry は scandir() によって生成されるオブジェクトです.os.DirEntryインスタンスの属性およびメソッドは以下の表のとおりです.

class os.DirEntry のオブジェクトの属性やメソッド
属性/メソッド 内容
name ファイル名やディレトリー名
path カレントディレクトリーからのパス
inode() 戻り値: inode 番号
is_dir(*, follow_symlinks=True) 戻り値: エントリーがディレクトリまたはディレクトリを指すシンボリックリンクの場合は True.follow_symlinks が False の場合,このエントリがディレクトリである場合にのみ True を返す.
is_file(*, follow_symlinks=True) 戻り値: エントリーがファイルまたはファイルを指しているシンボリックリンクであれば True.follow_symlinks が False の場合,ファイルである場合にのみ True を返す.
is_symlink() 戻り値: エントリーがシンボリックリンクの場合にTrue
stat(*, follow_symlinks=True) 戻り値: stat_result オブジェクト.このオブジェクについては,表を参照.
これら以外に様々な機能があります.残りはマニュアル「class os.DirEntry」(日本語)を参照.

os.stat_result は os.stat() や os.fstat(),os.lstat() によって生成されるオブジェクトです.stat 構造体のメンバーに対応する属性は,以下の表のとおりです.

os.stat_result オブジェクトの属性 (stat 構造体のメンバー)
属性 内容
st_mode ファイルモード: ファイルタイプとファイルモードビット (パーミッション)
st_ino iノード番号
st_dev このファイルが存在するデバイスの識別子
st_nlink ハードリンクの数
st_uid ファイル所有者のユーザ識別子
st_gid ファイル所有者のグループ識別子
st_size ファイルサイズ(バイト単位).シンボリックリンクのサイズは,含まれるパス名の長さ.
st_atime 秒で表した最終アクセス時刻
st_mtime 秒で表した最終内容更新時刻
st_ctime Unix: メタデータの最終更新時刻.Windows:作成時刻.単位は秒.
st_atime_ns ナノ秒 (整数) で表した最終アクセス時刻
st_mtime_ns ナノ秒 (整数) で表した最終内容更新時刻
st_ctime_ns Unix: メタデータの最終更新時刻.Windows: 作成時刻.ナノ秒 (整数).
これら以外に様々な機能があります.残りはマニュアル「class os.stat_result」(日本語)を参照.

ここにない機能は,高水準ファイル操作「shutil」を使います.例えば,「shutil.rmtree(path)」を使えば,ディレクトリーツリー全体を削除できます.

プロセスマネジメント

ここで示す機能は,プロセスの生成と管理に関するものです.

プロセスの生成

以下の表に示す全ての関数 (exec*) は,現在のプロセスを置き換え新たに指定されたプログラムを実行します.実行完了後,呼び出し元の Python のプログラムには戻りません.unix系の OS では,新しい実行可能ファイルが現在のプロセスにロードされ,呼び出し元 (Python プログラム) と同じプロセスIDとなります.エラーは OSError の例外として報告されます.

[注意] 現在のプロセス (Python) は,呼びだされたプログラムの実行に直ちに置き換えられます.その時に開いているファイルオブジェクトとディスクリプタはフラッシュされません.呼び出したプロセス (Python) のファイルにバッファリングされたデータがある場合は,exec* 関数を呼び出す前に sys.stdout.flush() または os.fsync() を使用してフラッシュするべきです.

exec* によるプログラムの実行
関数 プログラム探索 引数 環境引数
os.execl(path, arg0, arg1, …) 絶対/相対 固定
os.execle(path, arg0, arg1, …, env) 絶対/相対 固定 可能
os.execlp(prog, arg0, arg1, …) 環境変数 固定
os.execlpe(prog, arg0, arg1, …, env) 環境変数 固定 可能
os.execv(path, args) 絶対/相対 固定
os.execve(path, args, env) 絶対/相対 可変 可能
os.execvp(prog, args) 環境変数 可変
os.execvpe(prog, args, env) 環境変数 可変 可能

表中の引数の列が固定となっている関数 (関数名exec の後に 'p' が付く) は,PATH環境変数を使用して実行ファイルを検索します.パスの指定が不要で,通常のコマンドラインと同じ感覚でプログラムの起動ができます.それ以外は, 実行ファイルへの絶対パスまたは相対パスの指定が必要です.

表中の引数の列が固定となっている関数 (関数名に'l'が付く) は,実行するプロブラムの引数の数が予め決まっている場合に使います.引数リスト(arg0, arg1, …) にプログラムに渡す引数を記述します.一方,可変となている関数 (関数名に'v'が付く) は,実行するプロブラムが可変長の引数をとる場合に使います.引数(args)はタプル,あるいはリストで与えます.

[注意] モジュール os が提供するさまざまな exec* 関数は,引数リストを渡してプログラムを実行します.exec* 関数の最初の引数のは,ユーザーがコマンドラインで入力した引数ではなく,プログラムの名前です(なんでもOK). C言語のプログラムを考えると解りやすいです.C言語のプログラムの main(int argc, char *argv[]) に渡される argv[0] です.別の例で,os.execv('/bin/echo', ['foo', 'bar']) では,「bar」のみ標準出力に表示されます.fooは無視されます.

表中の引数の列が可能となっている関数 (関数名exec の後に 'e' が付く) は,環境変数をユーザー定義できます.辞書のようなマップ型のオブジェクでトを引数として渡します.

プロセスの管理

ここでは,プロセス管理に関する機能のうち使用頻度高いメソッドの概要を説明します.詳細については,マニュアル (英語, 日本語) を参照ください.Unix 系の OS でのみ有効なものがあります.Windows で使う場合は,注意が必要です.

「os」のプロセスマネージャーに関する使用頻度の高い機能
メソッド 内容
os.abort() 現在のプロセスに SIGABRT シグナルを生成し,プログラムは直ちに停止します.unix系 OS のデフォルトの動作はコアダンプの生成です.Windowsでは,プロセスは直ちに終了コード3を返します.
os._exit(n) クリーンアップハンドラを呼び出したり,stdio バッファをフラッシュしたりせずに,ステータス n でプロセスを終了します.標準的な終了方法は sys.exit(n) です.この _exit(n) は,fork() の後の子プロセスでのみ使用されるべきです.
os.fork() 子プロセスを生成します.子では0,親では子のプロセスIDを返します.エラーが発生すると,OSError が発生します.
os.forkpty() 子の制御端末としての新しい擬似端末 (pseudo-terminal) を使用して,子プロセスを生成します.
os.popen(cmd, mode='r', buffering=-1) コマンドcmdとの間でパイプを開く.
os.system(command) サブシェルでコマンド(文字列)を実行します.
os.times() 現在のグローバルプロセス時間を返します.
os.wait() 子プロセスの完了を待って,そのpidと終了ステータスの表示を含むタプルを返します.
os.waitid(idtype, id, options) 1つ以上の子プロセスの完了を待ちます.
これら以外に様々な機能があります.残りはマニュアル「Process Management」(日本語)を参照.

スケジューラー

ここで示す機能は,オペレーティングシステムによってプロセスに割り当てる CPU 時間を制御します.普通のユーザーがこの機能を使うことはまれでしょう.ここでは説明しないので,気になる場合は「Interface to the scheduler(翻訳)」が参考になります.

その他のシステム情報

ここでは,これまでのカテゴリーに入らないその他のシステム情報に関するメソッドのうち使用頻度高いものの概要を説明します.詳細については,マニュアル (英語, 日本語) を参照ください.

「os」の使用頻度の高いその他のシステム機能.
メソッド 内容
os.cpu_count() 戻り値: システム内の CPU の数,未定義の場合は None.
os.curdir 現在のディレクトリを参照するための定数文字列(通常: '.')
os.pardir 親ディレクトリを参照するための定数文字列(通常: '..')
os.sep パスでディレクトリーやファイル名を区切る文字.Unix 系 OS では '/',Windowsでは '\\'.
os.altsep パスのディレクトリーやファイル名を区切る代替文字.区切り文字が1つのみ存在する場合はNone.sep がバックスラッシュの Windows システムでは '/'に設定.
os.extsep 検索パス文字列中の複数のパスを分離する文字 (通常: ':' や ';').
os.defpath デフォルトの検索パス
os.linesep 戻り値: 改行文字列.Unix 系の OS では '\n',Windowsの場合は '\r\n'.テキストモードで開いたファイルを書き込むときに,行終端文字として os.linesep を使用しないでください (デフォルト).代わりに,すべてのプラットフォームで単一の '\n' を使用してください.
これら以外に様々な機能があります.残りはマニュアル「Miscellaneous System Information」(日本語)を参照.

乱数

乱数を発生させることもできます.

「os」の使用頻度の乱数の機能.
メソッド 内容
os.getrandom(size, flags=0) 戻り値: サイズで指定されたバイト数の乱数.メソッドは要求されたバイト数よりも少ないバイト数の数を返すことができます.
os.urandom(size) 戻り値: 指定サイズの暗号に適しランダム文字列.
これら以外に様々な機能があります.残りはマニュアル「Random numbers」(日本語)を参照.

モジュール os.path の機能

ページ作成情報

参考資料

  1. マニュアル「os ― Miscellaneous operating system interfaces」は詳しいです.
  2. マニュアルの日本語訳は「os ― 雑多なオペレーティングシステムインタフェース」です.

更新履歴

2017年8月25日 ページの新規作成


no counter