Argparseを使ったコマンドライン引数の管理
通常コマンドライン引数を扱うにはsys.argvを使います。
import sys args = sys.argv count = args[1] print(count)
$ py main.py 10 10
とてもシンプルですね。
ただ実際にちゃんとしたプログラムを組む場合、例えばコマンドライン引数が渡されなかった場合に例外にしたり、もしくはデフォルト値を設定したり、ハイフン始まりのオプション引数を用意したり、そういうことをやろうと思うとどんどん複雑になっていきます。
Argparseを使えばそういうったものをとても楽に実装することができます。
Argparse チュートリアル — Python 3.6.5 ドキュメント
とりあえず基礎的なものをいくつか実例で動作確認してみます。
ヘルプだけ用意された最小の例
import argparse
parser = argparse.ArgumentParser()
parser.parse_args()
$ py main.py -h usage: main.py [-h] optional arguments: -h, --help show this help message and exit $ py main.py --help usage: main.py [-h] optional arguments: -h, --help show this help message and exit
特に何も設定してない状態でも「-h」と「--help」が設定されます。
省略可能な引数を一つ設定する、省略時はデフォルト値が使われる。
import argparse parser = argparse.ArgumentParser() parser.add_argument("count", nargs='?', default=0) args = parser.parse_args() print(args.count)
$ py main.py 0 $ py main.py 10 10
nargsに'?'を設定すれば省略可能な引数を定義できます。defaultで省略時の値を設定できます。
オプション引数を設定する。
「-f」のようなハイフンで始まる独自のオプション引数を設定してみます。
import argparse parser = argparse.ArgumentParser() parser.add_argument("-f", "--foo") args = parser.parse_args() print(args.foo)
$ py main.py -h usage: main.py [-h] [-f FOO] optional arguments: -h, --help show this help message and exit -f FOO, --foo FOO
helpを見ると-fが追加されてるのが分かりますね。
$ py main.py -f 100 100 $ py main.py -f100 100 $ py main.py -f=100 100
この用に値を渡せます。
スペース空けたり空けなかったり、「=」を付けたり付けなかったりしてもどちらでも動作します。
型の変換をする
コマンドライン引数は全て文字列型になります。
import argparse parser = argparse.ArgumentParser() parser.add_argument("-f", "--foo") args = parser.parse_args() print(type(args.foo))
$ py main.py -f 100 <class 'str'>
これを例えば初めからint型にするにはtypeを使います
import argparse parser = argparse.ArgumentParser() parser.add_argument("-f", "--foo", type=int) args = parser.parse_args() print(type(args.foo)) print(args.foo)
$ py main.py -f 100 <class 'int'> 100
この状態でもし文字列を渡したりすると例外になります
$ py main.py -f aaa usage: main.py [-h] [-f FOO] main.py: error: argument -f/--foo: invalid int value: 'aaa'
またtypeは単に関数を指定するだけなので独自の関数を指定することで任意の変換処理をさせることができます。
import argparse def foo(s): return "["+s+"]"; parser = argparse.ArgumentParser() parser.add_argument("-f", "--foo", type=foo) args = parser.parse_args() print(args.foo)
$ py main.py -f aaa [aaa]
フラグ系のオプション引数を設定する。
値を設定する必要がない真偽値だけを持つオプション引数を設定してみます。
import argparse parser = argparse.ArgumentParser() parser.add_argument("--bar", action="store_true") args = parser.parse_args() print(args.bar)
$ py main.py False $ py main.py --bar True
他にも各引数にコメントを付けたりだとか色々機能はありますが、とりあえずこの辺りだけ覚えておけば実用に供すると思います。