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


他にも各引数にコメントを付けたりだとか色々機能はありますが、とりあえずこの辺りだけ覚えておけば実用に供すると思います。

https://docs.python.jp/3/library/argparse.html