Island Babies

いろんなことを書きます

argparse について

pythonコマンドラインから何かしらの引数を受け取る時って多くの場合はsys.argv[1]とかやると思うんですが、これをもっとキレイな形で書くためのライブラリが実はpythonには組み込まれています.
それがargparseと呼ばれるライブラリで、実に色々な設定を行うことができるようになっています.

導入

まずはサイトにある例を眺めてみます。

import argparse

parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('integers', metavar='N', type=int, nargs='+',
                    help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const',
                    const=sum, default=max,
                    help='sum the integers (default: find the max)')

args = parser.parse_args()
print(args.accumulate(args.integers))

これをprog.pyとして保存し、 -h とつけて呼び出してみます.

$ python prog.py -h
usage: prog.py [-h] [--sum] N [N ...]

Process some integers.

positional arguments:
 N           an integer for the accumulator

optional arguments:
 -h, --help  show this help message and exit
 --sum       sum the integers (default: find the max)

かなり情報量が多く、しっかりしているように見えますね!
argparse.ArgumentParser(description='Process some integers.')の部分で引数のパーサを定義し、さらに -h をつけて呼び出したときの説明文の情報を与えられます。
parser.add_argument()とすることで具体的に引数を定義できます。引数を指定するときには様々な情報を加えて引数を指定できます。
例えば、一つ目の

parser.add_argument('integers', metavar='N', type=int, nargs='+',
                    help='an integer for the accumulator')

では,

  • 最初の 'integers' で実際に格納される変数名を指定
  • metavar='N' で -h としたとき表示される文字を指定
  • type=int で引数として渡された文字列を変換したい型に変換する関数を指定
  • nargs='+' で引数の個数を指定
  • help=''sum the integers (default: find the max)'で-hとしたときのメッセージを指定

としています.
そして、parser.parse_args()で受け取った引数をパースします.
ドキュメントを見ると、おびただしい数のオプションがあります...いくつかを紹介します

epilog

エピローグみたいな感じだと思いますが、 -h としたとき最後に表示する文字列を指定できます.

>>> parser = argparse.ArgumentParser(
...     description='A foo that bars',
...     epilog="And that's how you'd foo a bar")
>>> parser.print_help()
usage: argparse.py [-h]

A foo that bars

optional arguments:
 -h, --help  show this help message and exit

And that's how you'd foo a bar

add_argument() メソッド

nargs

const

default

type

dest

などなどがかなり使えそうな感じです。(気が向いたら更新します)