操作
第10章 汎用 OS・ランタイムサービス¶
10.1 OS の機能を利用する os¶
-
実行中のプロセス属性の操作
プロセス属性 関数 環境変数 environ(),getenv(),setenv(), ...ユーザーID getuid(),setuid(),geteuid(),seteuid(), ...グループID getgid(),setgid(),getgroups(),setgroups(), ...プロセスID getpid(),getpgid(),getppid(), ...スケジューリング優先度 getpriority(),setpriority(), ... -
ファイルとディレクトリの操作
-
pathlibモジュールの方がおすすめ
関数 解説 戻り値 pathlib の同等関数 chdir(path)作業ディレクトリ設定 None chmod(path, mod, *, dirfd=None, follow_symlinks=True)モード変更 None Path.chmod()chown(path, uid, gid, *, dir_fd=None, follow_symlinks=True)所有者、グループの変更 None getcwd()現在のディレクトリを取得 str Path.cwd()listdir(path='.')ディレクトリ内のファイル、ディレクトリをリスト出力 list Path.iterdir()makedir(path, mode=0o777, *, dir_fd=None)ディレクトリ作成 None Path.mkdir()makedirs(name, mode=0o777, exist_od=False)中間ディレクトリを含めてディレクトリ作成 None Path.mkdir()remove(path, *, dir_fd=None)ファイルを削除 (ディレクトリの場合は OSError) None Path.unlink()removedirs(name)再帰的ディレクトリ削除 None rename(src dst, *, src_dir_fd=None, dst_dir_fd=None)名前変更 None Path.rename()renames(old, new)中間ディレクトリ削除・作成を含めた名前変更 None rmdir(path, *, dir_fd=None)ディレクトリを削除 None Path.rmdir()symlink(src, dst, target_is_directory=False, *, dir_fd=None)src を指すシンボリックリンクを dst のファイル名で作成 None Path.symlink_to()- ファイルパス関連定数
定数名 解説 戻り値 curdir現在のディレクトリ str pardir親ディレクトリ str sepパス名の区切り文字列 str extsepファイル名と拡張子を分ける文字 str linesep行の終端文字列 str
-
-
さまざまなシステム情報へのアクセス
関数名、辞書名 解説 戻り値 confstr(name)システム設定値の文字列取得 str confstr_namesconfstr() に渡すことのできる値を定義した辞書 dict sysconf(name)システム設定値の整数取得 int sysconf_names()sysconf() に渡すことのできる値を定義した辞書 dict cpu_count()CPU数の取得
取得できなくても None 返すだけint getloadavg()過去1分間、5分間、15分間の load average をタプルで返す (float, float, float) -
os.cpu_count()に似た動作の関数にmultiprocessing.cpu_count()がある- 違いは、CPU数を取得できなかった (Python が解決できなかった) 場合の挙動
-
os.cpu_count()None を返す -
multiprocessing.cpu_count()例外 NotImplementedError を送出
-
-
ランダムな文字列の生成
-
os.urandom()OS が提供する乱数生成機能を用いて 生成したランダムな bytes オブジェクトを返す-
randomモジュールの疑似乱数より、セキュリティ面ではosまたはsecretsモジュールの乱数生成が推奨されている
-
-
-
システム情報取得に使われるサードパーティ製パッケージ psutil
-
psutil.cpu_times()CPU時間を求める -
psutil.virtual_memory()メモリ使用率に関する統計情報を求める -
psutil.disk_partitions()マウント済みのディスクパーティション情報を取得 -
psutil.net_ioi_counters()ネットワーク I/O に関する統計情報を求める
-
10.2 ストリームを扱う io¶
open() で開いたファイル同様に扱う、ストリームオブジェクト、file-like オブジェクトについて
-
インメモリなテキストストリームを扱う StringIO
-
オブジェクト作成
StringIO(initial_value='', newline='\n')-
initial_value初期値となる文字列 -
newline改行文字
-
-
StringIOクラスのメソッドメソッド名 解説 戻り値 read(size=-1)ストリームの現在オフセットから指定サイズの文字列を返す
size が負の値または None なら EOF までstr write(s)ストリームに文字列を書き込む int tell()現在のオフセットを返す int seek(offset, whence=SEEK_OUT)オフセットを指定位置に移動する (詳細省略) int getvalue()ストリームが保持しているすべての内容を文字列で返す (オフセット位置に依らない、オフセットの移動もなし) str close()ストリームを閉じる None >>> import io >>> stream = io.StringIO("this is test\n") # 初期値を渡すことができる >>> stream.read(10) # ストリームから指定サイズだけ読み出す 'this is te' >>> stream.tell() # 現在のオフセットを返す 10 >>> stream.seek(0, io.SEEK_END) # オフセットをストリームの末尾に変更する 13 >>> stream.write('test') # ストリームに文字列を書き込む 4 >>> print(stream.getvalue()) # ストリームが保持するすべての内容を返す this is test test >>> stream.close() # ストリームを閉じる >>> stream.write('test') # 閉じたあとに書き込もうとすると例外を送出する Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: I/O operation on closed file >>> with io.StringIO() as stream: # withブロックを使うことで暗黙的にclose()を呼ぶこともできる ... stream.write('test') ... 4 >>> the_zen_of_python = """The Zen of Python, by Tim Peters ... Beautiful is better than ugly. ... Explicit is better than implicit. ... Simple is better than complex. ... Complex is better than complicated. ... """ >>> stream = io.StringIO(the_zen_of_python) >>> for line in stream: # for文で1行ずつ読み込むこともできる ... line ... 'The Zen of Python, by Tim Peters\n' 'Beautiful is better than ugly.\n' 'Explicit is better than implicit.\n' 'Simple is better than complex.\n' 'Complex is better than complicated.\n'
-
-
インメモリなバイナリストリームを扱う BytesIO
-
オブジェクト作成
BytesIO([initial_value])-
initial_value初期値の bytes オブジェクト
メソッド名 解説 戻り値 read(size=-1)ストリームの現在オフセットから指定サイズのバイト列を返す
size が負の値または None なら EOF までbytes write(s)ストリームにバイト列を書き込む int tell()現在のオフセットを返す int seek(offset, whence=SEEK_OUT)オフセットを指定位置に移動する (詳細省略) int getbuffer()バッファーの内容を返す
この値は読み込みおよび書き込みが可能なビューで、値を更新するとバッファーの内容も更新されるmemoryview getvalue()バッファーの内容を返す
この値を更新ができないbytes close()ストリームを閉じる None -
-
-
io モジュールをユニットテストで活用する
- ファイルオブジェクトの代わりに使用
- 標準出力などをキャプチャして比較
-
unittest.mock.patchでうまく使用できる
10.3インタープリターに関わる情報を取得、操作する sys¶
Python インタープリターが使用する変数、インタープリター動作に関する関数
-
コマンドライン引数を取得する argv
-
sys.argv実行時の引数がリストで保持されている-
argv[0]は、指定ファイル名 (実行時に指定したままの文字列)
# exampe.py import sys print(sys.argv)> python example.py -a AAA -b -c 5 ['example.py', '-a', 'AAA', '-b', '-c', '5'] -
-
-
ライブラリのインポートパスを操作する path
-
sys.pathインポート対象のライブラリやパッケージを検索するパスを格納したリスト- ファイルパスを追加することで、import 可能なパッケージやモジュールを動的に変更できる
- 初期化は以下の順に行われる
- 実行された Python スクリプトのあるパス or 空文字列 (対話モード)
- 環境変数
PYTHONPATHに設定されたパス - Python のインストール先
- モジュールはリストの先頭のパスから順に検索され、最初に見つかったものがインポートされる (つまり、同名モジュールがあっても、リストの後ろにあるとインポートされない)
-
-
プログラムを終了する exit()
-
sys.exit()呼び出した時点で Python スクリプトの実効を終了する関数 -
exit([arg])-
arg数値または任意のオブジェクト- 数値を指定すると、それを終了コードとする (未指定だと 0 扱い)
- 数値以外を指定すると、オブジェクトを文字列として
sys.stderrへ出力し、終了コードは 1 となる
-
-
-
コンソールへの入出力を扱う stdin, stdout, stderr
オブジェクト 解説 タイプ sys.stdin標準入力 読み込み専用 sys.stdout標準出力 書き込み専用 sys.stderr標準エラー出力 書き込み専用 >>> sys.stdout.write('standard output message\n') standard output message # 標準出力された文字列 24 # write()メソッドの戻り値 >>> sys.stderr.write('standard error message\n') standard error message # 標準エラー出力された文字列 23 # write()メソッドの戻り値 >>> sys.stdin.write('standard input message?\n') Traceback (most recent call last): # 標準入力オブジェクトは読み込み専用のため、書き込みは失敗する File "<stdin>", line 1, in <module> io.UnsupportedOperation: not writable >>> sys.stdin.read() standard input message # 端末に任意の文字列を入力して改行 'standard output message\n' # Ctrl+D(EOF)が入力されると、read()が受け取った値を返す (Windows だと Ctrl+Z か) -
breakpoint() 実行時のフック関数 breakpointhook()
sys.breakpointhook()- 組み込み関数
breakpoint()でデバッグを開始した際に呼ばれるフック関数- (breakpoint() : 第17章)
-
Python のバージョン番号を調べる version_info
-
sys.version_infoバージョン番号を表す 5 要素タプル-
majorminormicroreleaselevelserial -
releaselevel以外は整数 (releaselevel は基本的に文字列か)
-
-
10.4 コマンドラインオプション、引数を扱う argparse¶
- コマンドラインオプションを扱う
-
ArgumentParser()引数名 解説 デフォルト値 progプログラム名 sys.args[0]usageプログラム利用方法 パーサー指定した引数から自動生成 description引数のヘルプの前に表示される文字列 Noneepilog引数のヘルプの後に表示される文字列 NoneparentsArgumentParser オブジェクトのリストを指定すると、そこに含まれる引数が追加される []formatter_classヘルプとして表示されるフォーマットをカスタマイズするためのクラス argparse.HelpFormatterprefix_chars引数の先頭の文字を指定する -fromfile_from_chars引数をファイル指定して読み込む際に、フファイルの前に付ける文字を指定 None -
add_argument() -
parse_args()
-
# repeat.py
import argparse
# パーサーのインスタンスを作成
parser = argparse.ArgumentParser(description='Example command')
# 文字列を受け取る-sオプションを定義
parser.add_argument('-s', '--string', type=str, help='string to display', required=True)
# 数値を受け取る-nオプションを定義
parser.add_argument('-n', '--num', type=int, help='number of times repeatedly display the string', default=2)
# 引数をパースし、得られた値を変数に格納する
args = parser.parse_args()
# パースによって得られた値を扱う
print(args.string * args.num)
- 実行例
-
-hオプションは、ArgumentParser()によって自動生成される -
必須オプションが無いとエラーが発生する
> python repeat.py usage: repeat.py [-h] -s STRING [-n NUM] repeat.py: error: the following arguments are required: -s/--string > python repeat.py -h usage: repeat.py [-h] -s STRING [-n NUM] Example command options: -h, --help show this help message and exit -s, --string STRING string to display -n, --num NUM number of times repeatedly display the string -
引数指定実行
> python repeat.py -s "Hey! " Hey! Hey! > python repeat.py -s "Hey! " -n 5 Hey! Hey! Hey! Hey! Hey!
-
Tatsuya ISHIGAKI さんが4ヶ月前に更新 · 2件の履歴