set setting reset

脂肪と糖にはたらくやつ

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 を触ってみます。