argparse をつかってコマンドライン引数をよしなにする
よくつかうのでメモとして残してみます。
argparse とは
python の組み込みライブラリで、引数をよしなにしてくれるいい人です。
python 2.7 から追加されました。
15.4. argparse — コマンドラインオプション、引数、サブコマンドのパーサー — Python 2.7.x ドキュメント
よくやること
コマンドラインで実行する系のスクリプトでオプションを指定するときなどに便利なので、そのように使うことが多いです。
ロングオプションを指定したり、変数に自動で格納してくれたり、位置をきにしなくて良かったり、 --help で Usage を自動で生成したりしてくれます。
例えば以下のようなコードを動かしてみます。
#!/usr/bin/env python # -*- coding: utf-8 -*- from argparse import ArgumentParser def argument_parser(): parser = ArgumentParser(description="this is description") parser.add_argument( "-n", "--neko", dest="neko", type=str, help="specified neko") return parser.parse_args() if __name__ == '__main__': p = argument_parser() print(p.neko)
help を表示してみます。
$ python test.py --help usage: test.py [-h] -n NEKO this is description optional arguments: -h, --help show this help message and exit -n NEKO, --neko NEKO specified neko
オプションを正しく指定すると以下の様に普通に print() されます。
$ python test.py -n saba saba $ python test.py --neko mike mike
必須オプションをつくる
require=True
を指定すると必須オプションをつくれます。
"-n", "--neko", dest="neko",
type=str,
+ required=True,
help="specified neko")
引数を与えずに実行すると、エラーになります。
$ python test.py usage: test.py [-h] -n NEKO test.py: error: argument -n/--neko is required
オプションの選択肢を固定する
choices=[]
を使うと選択肢を固定できます。
"-n", "--neko", dest="neko",
type=str,
required=True,
+ choices=["saba", "mike"],
help="specified neko")
正しく実行すると、普通です。
$ python test.py --neko saba saba 01:50:41 ~ $ python test.py --neko mike mike
choices にないオプションを与えるとエラーになります。
$ python test.py --neko kuroneko usage: test.py [-h] -n {saba,mike} test.py: error: argument -n/--neko: invalid choice: 'kuroneko' (choose from 'saba', 'mike')
順番をきにしなくてよい
2 つのオプションを定義してみます。
#!/usr/bin/env python # -*- coding: utf-8 -*- from argparse import ArgumentParser def argument_parser(): parser = ArgumentParser(description="this is description") parser.add_argument( "-n", "--neko", dest="neko", type=str, required=True, choices=["saba", "mike"], help="specified neko") parser.add_argument( "-i", "--inu", dest="inu", type=str, help="specified inu") return parser.parse_args() if __name__ == '__main__': p = argument_parser() print(p.neko) print(p.inu)
help を見てみると、オプションが自動で追加されています。
$ python test.py --help usage: test.py [-h] -n {saba,mike} [-i INU] this is description optional arguments: -h, --help show this help message and exit -n {saba,mike}, --neko {saba,mike} specified neko -i INU, --inu INU specified inu
引数の位置を変えて実行しても結果は同じになります。らくちん。
$ python test.py -n mike --inu shiba mike shiba $ python test.py -i shiba --neko saba saba shiba
おわり。
次は流行りの click を触ってみます。