ArgumentParser でコマンドライン引数を解析する
argparse — コマンドラインオプション、引数、サブコマンドのパーサー — Python 3.9.1 ドキュメント
Python でコマンドライン引数を使ったプログラムを作成する場合、標準ライブラリとして提供される argparse モジュール を使用すると便利です。
例えば cat
コマンドでファイル内容を出力するとき、コマンドライン引数で -n
or --number
を付けてやると、以下のように行番号も一緒に表示してくれます。
$ cat a.txt -n
1 hello
2 world
この時の引数 a.txt
や -n
, --number
をいい感じに解析してくれるモジュールが argparse
です。もちろん sys.argv
を自前で解析するプログラムを書くこともできますが、いろいろな条件を考慮して処理を書くと大変になるので argparse モジュールを使うと便利です。
標準ライブラリなのですぐに使うことができます。
使い方
使い方は簡単でモジュールをインポートし、パーサーに対して使用する引数を条件を指定しながら追加していくだけです。最後にパースを実行すれば指定した条件で解析してくれます。
import argparse
# パーサーの生成
parser = argparse.ArgumentParser(description='ここにコマンドの説明を書きます。')
# 必須引数
parser.add_argument('value', type=str, help='文字列の必須引数です。')
# オプション引数(省略可能)
parser.add_argument('-o', '--option', help='ハイフン始まりの引数は省略可能です。')
# コマンド引数解析実行
ns = parser.parse_args()
# 確認
print(ns)
上記コード a.py
問う名前のファイルとして保存し、コマンド引数を指定してを実行します。
$ python a.py hoge --option=123
Namespace(option='123', value='hoge')
コマンド引数がパースされて Namespace(option='123', value='hoge')
という形で確認できました。
コマンド引数なしで実行するとエラーになることが確認できます。
$ python a.py
usage: a.py [-h] [-o OPTION] value
a.py: error: the following arguments are required: value
コマンドの使い方の説明も自動で生成してくれてどのような引数が指定できるか確認できます。実は自動でヘルプも生成してくれるので -h
でヘルプも見れます。
$ python a.py -h
usage: a.py [-h] [-o OPTION] value
ここにコマンドの説明を書きます。
positional arguments:
value 文字列の必須引数です。
optional arguments:
-h, --help show this help message and exit
-o OPTION, --option OPTION
ハイフン始まりの引数は省略可能です。
便利ですね。
parser.parse_args()
は引数を指定しないとコマンド引数を解析しますが、配列を渡すとその値を使って解析してくれます。
よくある使い方
必須引数とオプション引数以外にもいろいろパラメータを指定できます。以下よくある使い方をまとめます。
型を指定する type
type
に型を指定することで解析時に引数の型を合わせてチェックします。失敗すればエラーになります。
import argparse
parser = argparse.ArgumentParser(description='ここにコマンドの説明を書きます。')
# str, int, float
parser.add_argument('str', type=str, help='文字列の必須引数です。')
parser.add_argument('int', type=int, help='整数値の必須引数です。')
parser.add_argument('float', type=float, help='小数値の必須引数です。')
# Namespace(float=3.14, int=100, str='string')
ns = parser.parse_args(['string', '100', '3.14'])
print(ns)
複数の値をリストで取得する nargs
import argparse
parser = argparse.ArgumentParser(description='ここにコマンドの説明を書きます。')
# 可変長の引数
parser.add_argument('--values', type=int, nargs='*')
# 固定長の引数
parser.add_argument('--pair', nargs=2, help='2個の整数値を受け取ります。')
# Namespace(pair=['x', 'y'], values=[1, 2, 3])
ns = parser.parse_args('--values 1 2 3 --pair x y'.split())
print(ns)
# Namespace(pair=None, values=[])
ns = parser.parse_args('--values'.split())
print(ns)
# ns = parser.parse_args('--pair'.split())
# : error: argument --pair: expected 2 arguments
オプション引数の場合、nargs
で引数で受け取る個数を指定できます。受け取った値は指定された型のリストとして保持されます。
nargs='*'
とすることで可変長の引数として受け取れます。1件だけの指定でもリストとして解析されます。
あくまでオプション引数なので、指定しない場合は None
になります。可変長引数の場合は値なしで空リストになりますが、固定長の場合はエラーになります。
引数があるかどうかフラグとして扱う
import argparse
parser = argparse.ArgumentParser(description='ここにコマンドの説明を書きます。')
# 可変長の引数
parser.add_argument('--flag', action='store_true')
# Namespace(flag=True)
ns = parser.parse_args('--flag'.split())
print(ns)
# Namespace(flag=False)
ns = parser.parse_args(''.split())
print(ns)
--flag
という引数が指定されていれば True
指定されてなければ False
になるような、フラグとして扱いたいときには action='store_true'
と指定するとよいです。
parse_args の結果を Namespace ではなく辞書型で取得する
Namespace ではなく辞書型のほうが扱いやすい場合は vars()
を使えば辞書に変換できます。
import argparse
# パーサーの生成
parser = argparse.ArgumentParser(description='ここにコマンドの説明を書きます。')
parser.add_argument('value', type=str, help='文字列の必須引数です。')
parser.add_argument('-o', '--option', help='ハイフン始まりの引数は省略可能です。')
ns = parser.parse_args('a -o=123'.split())
# Namespace を辞書にする
dic = vars(ns)
# 確認
print(dic)
# {'value': 'a', 'option': '123'}
参考URL
argparse — コマンドラインオプション、引数、サブコマンドのパーサー — Python 3.9.1 ドキュメント
コメントを書く