Q1sys.path が表すものはどれですか?
sys と argparse — 実行環境と引数処理
Python の sys モジュールと argparse モジュールを基礎から解説します。sys.path / sys.argv / sys.exit で実行環境を読み取る使い方から、argparse で引数を構造化する書き方まで、ハンズオンで学べます。
Python の実行環境にアクセスする sys モジュールと、コマンドライン引数を構造化する argparse モジュールの使い方を整理します。sys.path / sys.argv / sys.exit の基本から、argparse の ArgumentParser で型変換・既定値・選択肢を伴う引数定義まで扱います。
sys モジュール — Python の実行環境を読み取る
sys モジュール は、いま動いている Python プロセス自身の情報にアクセスするための標準ライブラリです。何が import 可能か(sys.path)、コマンドラインから何を受け取ったか(sys.argv)、Python のバージョンや動作プラットフォームは何か(sys.version / sys.platform)、そしてプロセスをどう終了させるか(sys.exit)まで、Python 自身に関する情報と関数 がここに集約されています。
| 属性・関数 | 型 | 意味 |
|---|---|---|
| sys.path | list[str] | import がモジュールを探すフォルダのリスト |
| sys.argv | list[str] | コマンドラインから渡された引数のリスト |
| sys.version | str | Python のバージョン文字列 |
| sys.platform | str | 動いている OS の識別子('darwin' / 'linux' / 'win32' など) |
| sys.exit(code) | 関数 | 指定した終了コードでプロセスを終了する |
| sys.stdout | TextIO | 標準出力。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.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 のリストとして渡される。先頭はスクリプト名なので、引数として使うのは 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)
--keyword Apple --limit 5 のような形を args.keyword / args.limit のような 属性アクセスできるオブジェクト に変換する。ブラウザでは parse_args(リスト) 形式を使う
ブラウザ実行環境には sys.argv がないので、引数なしの parse_args() だとエラーになります。テストで使うのと同じ リスト渡しの形式、つまり parse_args(["--keyword", "Apple", "--limit", "5"]) で動かします。実機ではこのリストを省略すれば自動で sys.argv[1:] が使われます。
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" が入って事故になります。
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(0) は正常終了、sys.exit(1) は異常終了として呼び出し元(シェルや CI)に伝わる。実機ではシェルから $? で終了コードを確認できる。sys.exit を呼ばなければ、スクリプトは最後の行まで実行される。理解度チェック
まずは1問ずつ答えてみましょう。
Q2sys.exit(1) の意味として最も近いのはどれですか?
Q3ブラウザで argparse を試したいとき、sys.argv の代わりに使える書き方はどれですか?