Q1sys.pathが表すものはどれですか?
sys と argparse — 実行環境と引数処理
sys.path/sys.argv/sys.platform/sys.exitで実行環境を読み取り、argparseのArgumentParser → add_argument → parse_args 3ステップでCLI引数を構造化する書き方を実行で学びます。
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の代わりに使える書き方はどれですか?