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

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の基本から、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.pathimport がモジュールを探すフォルダのリストで、上から順に走査されます。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の代わりに使える書き方はどれですか?