順番に読み進めながら学べます

sys と argparse — 実行環境と引数処理

Python の sys モジュールと argparse モジュールを基礎から解説します。sys.path / sys.argv / sys.exit で実行環境を読み取る使い方から、argparse で引数を構造化する書き方まで、ハンズオンで学べます。

Python の実行環境にアクセスする sys モジュールと、コマンドライン引数を構造化する argparse モジュールの使い方を整理します。sys.path / sys.argv / sys.exit の基本から、argparseArgumentParser で型変換・既定値・選択肢を伴う引数定義まで扱います。

sys モジュール — Python の実行環境を読み取る

sys モジュール は、いま動いている Python プロセス自身の情報にアクセスするための標準ライブラリです。何が import 可能か(sys.path)、コマンドラインから何を受け取ったか(sys.argv)、Python のバージョンや動作プラットフォームは何か(sys.version / sys.platform)、そしてプロセスをどう終了させるか(sys.exit)まで、Python 自身に関する情報と関数 がここに集約されています。

sys モジュールが扱う 4 つの領域
sys モジュール実行環境sys.pathsys.version入出力sys.argvsys.stdout終了制御sys.exitPython 情報sys.platform
sys は 実行環境(path / version / platform)入出力(argv / stdout)終了制御(exit) をまとめて扱う。argparse などの周辺ライブラリも sys.argv を読み取って動く。
属性・関数意味
sys.pathlist[str]import がモジュールを探すフォルダのリスト
sys.argvlist[str]コマンドラインから渡された引数のリスト
sys.versionstrPython のバージョン文字列
sys.platformstr動いている OS の識別子('darwin' / 'linux' / 'win32' など)
sys.exit(code)関数指定した終了コードでプロセスを終了する
sys.stdoutTextIO標準出力。print の書き込み先

`sys.path`import がモジュールを探すフォルダのリスト で、上から順に走査されます。for p in sys.path: でループすれば、登録されている各フォルダを 1 行ずつ確認できます。Pyodide ランタイムでは /lib/python312.zip / /lib/python3.12 / /lib/python3.12/lib-dynload / /lib/python3.12/site-packages のようなパスが並んでおり、実機の Python では、本体の標準ライブラリのフォルダや site-packages(pip でインストールしたライブラリの置き場所)などが登録されています。

sys モジュールから プラットフォームモジュール検索パスの中身 を取り出して表示します。sys を使うと いま動いている Python プロセスの情報 にアクセスできます。

① sys モジュールを読み込んでください

sys.platformプラットフォーム: ◯◯ の形で実行環境名を表示してください

sys.path の各要素を for ループで 1 行ずつ 表示してください(空文字 '' の要素は分かりやすいラベルに置き換え)

(正しく実行できれば解説が表示されます)

Python エディタ

コードを実行してください

sys.platform動いている OS の識別子 を文字列で返す属性です。ブラウザの Pyodide ランタイムでは emscripten と表示されます(実機では darwin(Mac の場合)/ win32(Windows の場合)/ linux などになります)。OS ごとに処理を分岐させたい場面で使われます。

import sys

print("プラットフォーム:", sys.platform)
# Mac:     プラットフォーム: darwin
# Windows: プラットフォーム: win32
# Linux:   プラットフォーム: linux
# ブラウザ: プラットフォーム: emscripten

sys.argv と argparse — コマンドライン引数の処理

実機の Python では、コマンドライン python script.py user_name 42 のように渡したトークンが、sys.argv文字列のリスト として入ります。sys.argv[0] がスクリプト名、sys.argv[1:] が渡された引数です。argparse モジュールは、この sys.argv を読み取って 属性アクセスできるオブジェクト に変換する標準ライブラリで、型変換や既定値、選択肢の制限などを宣言的に書けるようにします。

コマンドライン引数が sys.argv に入る流れ
python script.pyuser_name 42argv[0]'script.py'argv[1]'user_name'argv[2]'42'
コマンドラインの各トークンが、左から順に sys.argv のリストとして渡される。先頭はスクリプト名なので、引数として使うのは sys.argv[1:] から。
# script.py(実機の Python で動かす想定)
import sys

print(sys.argv)
# 例: python script.py user_name 42 と起動すると
# ['script.py', 'user_name', '42']

# 引数として使うのは [1:]
args = sys.argv[1:]
print(args)         # ['user_name', '42']

ブラウザでは sys.argv はほぼ空

本シリーズが動くブラウザ実行環境では、コマンドラインがそもそも存在しないので sys.argv には ['<exec>'] のような 固定値 が入っているだけです。実機の挙動は上の code ブロックで確認し、ハンズオンでは sys.argv の中身を直接代入する形で代用します。

sys.argv手で取り出して処理する と、数字に変換したい/省略可能なオプションを持たせたい/--help で使い方を表示したい、といった要件にすぐぶつかります。Python ではこれらをまとめて引き受ける argparse モジュールが標準で用意されており、基本の流れは 3 ステップです — ArgumentParser を作る → add_argument で受け取りたい引数を定義する → parse_args で値に変換する、です。

# 実機の Python での書き方
import argparse

parser = argparse.ArgumentParser(description="商品検索 CLI")
parser.add_argument("--keyword", required=True)         # --keyword Apple のように渡す
parser.add_argument("--limit", type=int, default=10)    # 数値に自動変換

args = parser.parse_args()                              # ← sys.argv[1:] を読み取る
print(args.keyword, args.limit)
argparse の処理の流れ
sys.argv['--keyword', 'Apple','--limit', '5']ArgumentParser+ add_argumentparse_args()args オブジェクト.keyword / .limit解析
コマンドライン文字列を ArgumentParser が解析し、--keyword Apple --limit 5 のような形を args.keyword / args.limit のような 属性アクセスできるオブジェクト に変換する。

ブラウザでは parse_args(リスト) 形式を使う

ブラウザ実行環境には sys.argv がないので、引数なしの parse_args() だとエラーになります。テストで使うのと同じ リスト渡しの形式、つまり parse_args(["--keyword", "Apple", "--limit", "5"]) で動かします。実機ではこのリストを省略すれば自動で sys.argv[1:] が使われます。

商品検索 CLI の引数解析を argparse で書きます。--keyword--limit の 2 つのオプションを受け取れるパーサーを作って、擬似的な引数リストを解析させます。

実機の Python では parse_args() を引数なしで呼ぶと sys.argv から自動的に引数が読み込まれますが、本演習はブラウザで動かしているため sys.argv 相当のリストを parse_args() に手動で渡します。

① argparse を読み込み、パーサーを作ってください

--keyword--limit の 2 つの引数を登録してください

["--keyword", "Apple", "--limit", "5"] というリストを解析させてください(ブラウザには本物の sys.argv がないので、リストを直接渡す形を使います)

④ 解析結果から keyword と limit の値を取り出して、スペース区切りで 1 行に表示してください

Python エディタ

コードを実行してください

argparse の応用 — 型変換・デフォルト・選択肢

add_argument には引数の振る舞いを制御するオプションがいくつもあります。よく使うのは次の 4 つで、これだけで実用的な CLI ツールの引数定義はほぼカバーできます。

オプション効果
type受け取った文字列を別の型に変換するtype=int → '5' を 5 に変換
default省略時の既定値を決めるdefault=10
required必須にして、欠けるとエラーrequired=True
choices許容する値のリストを限定するchoices=['asc', 'desc']
import argparse

parser = argparse.ArgumentParser()
parser.add_argument("--keyword", required=True)
parser.add_argument("--limit", type=int, default=10)
parser.add_argument("--order", choices=["asc", "desc"], default="asc")

args = parser.parse_args(["--keyword", "Apple", "--limit", "5", "--order", "desc"])
print(args.keyword, args.limit, args.order)
# → Apple 5 desc

type と default の組み合わせ

type=int, default=10 のように 両方指定する と、引数が省略されたとき 10(int)が入り、渡されたときは渡された値が int に変換されて入ります。default の値は変換が走らない ので、最初から目的の型で書くこと。default="10" と書くと省略時だけ文字列の "10" が入って事故になります。

在庫検索 CLI の引数定義を、型変換・既定値・選択肢付きで作ります。--limit を省略してデフォルト値が使われることを確かめます。

実機では parse_args() を引数なしで呼ぶと sys.argv から自動的に引数が読み込まれますが、ブラウザで動かしているため擬似的な引数リストを直接渡します。

① argparse を読み込み、パーサーを作ってください

② 次の 3 つの引数を登録してください

- --keyword: 必須

- --limit: 整数型、未指定なら 10

- --order: ascdesc のどちらか、未指定なら asc

--keyword Banana --order desc 相当のリストを解析させてください(--limit は省略します)

④ keyword, limit, order の 3 つの値をスペース区切りで 1 行に表示してください

Python エディタ

コードを実行してください

sys.exit — 終了コードを返す

sys.exit(コード) は数字を渡してプロセスを終了させる関数です。0 が正常終了、0 以外(多くは 1)が異常終了 という慣習があり、CI やシェルスクリプトはこの値を見て後続処理を分岐させます。Python の中では SystemExit という例外を発生させる仕組みになっており、try / except で捕まえることもできますが、通常は捕まえずにそのままプロセスが落ちます。

import sys

price = -100

if price < 0:
    print("エラー: 価格が負の値です")
    sys.exit(1)         # ← ここで関数の続きは実行されない

print("処理を続ける")    # price >= 0 のときだけ実行される
sys.exit でプロセスを終了する流れ
sys.exit(0)正常終了終了コード 0sys.exit(1)異常終了終了コード 1sys.exit を呼ばない最後の行まで実行終了コード 0シェルで $?終了コードを確認
sys.exit(0) は正常終了、sys.exit(1) は異常終了として呼び出し元(シェルや CI)に伝わる。実機ではシェルから $? で終了コードを確認できる。sys.exit を呼ばなければ、スクリプトは最後の行まで実行される。

在庫数のバリデーションsys.exit で書きます。負の在庫が来たら異常終了し、その後の処理は実行されないことを確かめます。

① sys を読み込んでください

② 在庫数を -3 に設定してください(異常な値を再現するため)

③ 在庫数が負なら エラー: 在庫数が負の値です と表示してから、終了コード 1 でプロセスを終了させてください

④ if の外側で 在庫チェック OK: ◯◯ の形で在庫数を表示してください(負のときには実行されないはずです)

Python エディタ

コードを実行してください
QUIZ

理解度チェック

まずは1問ずつ答えてみましょう。

Q1sys.path が表すものはどれですか?

Q2sys.exit(1) の意味として最も近いのはどれですか?

Q3ブラウザで argparse を試したいとき、sys.argv の代わりに使える書き方はどれですか?