Pythonのargparseを使う機会があったので、触ってみました。
実行環境
Anacondaで作成したPython 3.13.16で検証しています。
シナリオ1
main関数の処理はprint("main関数の処理")の実行有無で判断しました。
ヘルプの文章は好きなようにカスタムできるようにしています。
-h / --help自体のヘルプ文章もカスタムしているため、意図的にadd_help=Falseを設定しています。
| コマンド | 出力 | main関数の処理 |
|---|---|---|
| python sample1.py -h | ヘルプ → 終了 | 表示されない |
| python sample1.py | ヘルプ → 終了 | 表示されない |
| python sample1.py -G | G オプションが指定されました | 表示される |
| python sample1.py -x(未定義の引数) | usage とエラー → 終了(コード2) | 表示されない |
sample1.py
import argparse
def main():
parser = argparse.ArgumentParser(
prog="sample1",
description="argparse のサンプルプログラム",
epilog="例: python sample1.py -h",
add_help=False, # 標準の -h を無効にする
)
# -h を自分で定義し、help の文言を自由に変えられるようにする
# action="help"は、ヘルプの文章を表示するためのアクションです。"
parser.add_argument(
"-h", "--help",
action="help",
help="ヘルプの文章は好きに変えられます",
)
# store_true は、オプションが指定された場合に True を返すアクションです。
parser.add_argument(
"-G",
action="store_true",
help="G オプションが指定された場合に True になります",
)
parser.parse_args()
if parser.parse_args().G:
print("G オプションが指定されました")
else:
parser.print_help()
exit() # ここでプログラムを終了し、後続の main の処理は実行しない
print("main関数の処理")
if __name__ == "__main__":
main()
実行してみると想定通りになっています。
> python sample1.py --help
usage: sample1 [-h] [-G]
argparse のサンプルプログラム
options:
-h, --help ヘルプの文章は好きに変えられます
-G G オプションが指定された場合に True になります
例: python sample1.py -h
>python sample1.py
usage: sample1 [-h] [-G]
argparse のサンプルプログラム
options:
-h, --help ヘルプの文章は好きに変えられます
-G G オプションが指定された場合に True になります
例: python sample1.py -h
>python sample1.py -G
G オプションが指定されました
main関数の処理
>python sample1.py -x
usage: sample1 [-h] [-G]
sample1: error: unrecognized arguments: -x
シナリオ2
シナリオ1だと特に面白くはないです。
何となくオーバーライドって言ってみたいので、ヘルプ表示の後に任意の処理を実行できるようにしてみます。
早速、print_helpをオーバーライドしてみました。
| コマンド | 出力 | main関数の処理 |
|---|---|---|
| python sample2.py -h | ヘルプ → ヘルプ表示後の処理も実行できます → 終了 | 表示されない |
| python sample2.py | ヘルプ → ヘルプ表示後の処理も実行できます → 終了 | 表示されない |
| python sample2.py -G | G オプションが指定されました | 表示される |
| python sample2.py -x(未定義の引数) | usage とエラー → 終了(コード2) | 表示されない |
sample2.py
import argparse
class MyArgumentParser(argparse.ArgumentParser):
"""print_help をカスタムした ArgumentParser"""
# print_help をオーバーライドして、ヘルプ表示後に 任意の処理 を実行するようにする
def print_help(self, file=None):
super().print_help(file) # 元のヘルプ表示
print("ヘルプ表示後の処理も実行できます") # ヘルプ表示後の処理
self.exit() # ここでプログラムを終了し、後続の main の処理は実行しない
def main():
parser = MyArgumentParser(
prog="sample2",
description="argparse のサンプルプログラム",
epilog="例: python sample2.py -h",
add_help=False, # 標準の -h を無効にする
)
# -h を自分で定義し、help の文言を自由に変えられるようにする
# action="help"は、ヘルプの文章を表示するためのアクションです。"
parser.add_argument(
"-h", "--help",
action="help",
help="ヘルプの文章は好きに変えられます",
)
# store_true は、オプションが指定された場合に True を返すアクションです。
parser.add_argument(
"-G",
action="store_true",
help="G オプションが指定された場合に True になります",
)
parser.parse_args()
if parser.parse_args().G:
print("G オプションが指定されました")
else:
parser.print_help()
# sample1.pyでは後続処理を実行させないためにexitを記載していましたが、print_helpのカスタムに加えたので削除しています。
print("main関数の処理")
if __name__ == "__main__":
main()
実行してみると想定通りです。
>python sample2.py --help
usage: sample2 [-h] [-G]
argparse のサンプルプログラム
options:
-h, --help ヘルプの文章は好きに変えられます
-G G オプションが指定された場合に True になります
例: python sample2.py -h
ヘルプ表示後の処理も実行できます
>python sample2.py
usage: sample2 [-h] [-G]
argparse のサンプルプログラム
options:
-h, --help ヘルプの文章は好きに変えられます
-G G オプションが指定された場合に True になります
例: python sample2.py -h
ヘルプ表示後の処理も実行できます
>python sample2.py -G
G オプションが指定されました
main関数の処理
>python sample2.py -x
usage: sample2 [-h] [-G]
sample2: error: unrecognized arguments: -x