argparseを用いてpythonでコマンドライン引数を使う

argparseの基本的な実装

pythonでコマンドライン引数を使いたいときはargparseです。

基本的な実装はこうなります。

# test.py
import argparse

# パーサーオブジェクトを生成する。
parser = argparse.ArgumentParser()

# コマンドラインからの引数の仕様を登録する。
# 初期値を設定できる。
parser.add_argument('--value_01', default=2, type=int)
parser.add_argument('--value_02', default=4.5, type=float)
parser.add_argument('--value_03', default='aaa', type=str)
parser.add_argument('--value_04', default=None, type=str)

# パーサーを実行し、引数を解析する。
# コマンドラインからの引数がない場合は、初期値のままとなる。
args = parser.parse_args()
print(args)
print(type(args))
# Namespace(value_01=2, value_02=4.5, value_03='aaa', value_04=None)
# <class 'argparse.Namespace'>

# 変数の値を表示する。
print(args.value_01)
print(args.value_02)
print(args.value_03)
print(args.value_04)
# 2
# 4.5
# aaa
# None

# vars()で辞書型に変換できる。
print(vars(args))
print(type(vars(args)))
# {'value_01': 2, 'value_02': 4.5, 'value_03': 'aaa', 'value_04': None}
# <class 'dict'>

コマンドライン引数を使ってみる

ハイフン✕2+変数名で変数を指定して、スペースを空けて、変数の値を入力します。

$ python test.py --value_01 5 --value_02 5.5 --value_03 ddd --value_04 eee

5
5.5
ddd
eee

もっと便利に使う

引数の値を限定させる

choicesで、コマンドライン引数の値を選択肢の中の値だけに限定できます。

# test_choises.py
import argparse

parser = argparse.ArgumentParser()

# choicesオプションで選択肢を設定
parser.add_argument(
    '--mode',
    default=None,
    type=str,
    choices=['fast', 'slow'],
    )

args = parser.parse_args()
print(args.mode)
$ python test_choises.py --mode slow

slow

選択肢に無い単語を使うと、エラーになります。

$ python test_choises.py --mode middle

usage: test_choises.py [-h] [--mode {fast,slow}]
test_choises.py: error: argument --mode: invalid choice: 'middle' (choose from 'fast', 'slow')

引数の入力を必須にする

requiredで、指定したパラメータの入力を必須にできます。

# test_required.py
import argparse

parser = argparse.ArgumentParser()

# requiredオプションでmodeパラメータを必須にする。
parser.add_argument(
    '--mode',
    default='default',
    type=str,
    choices=['fast', 'slow'],
    required=True,
    )

args = parser.parse_args()
print(args.mode)
$ python test_required.py --mode fast

fast

必須パラメータの入力が無い場合は、エラーになります。

$ python test_required.py

usage: test_required.py [-h] --mode {fast,slow}
test_required.py: error: the following arguments are required: --mode

オプション設定時の動作を指定する

actionで、コマンドライン引数でオプションが設定されたときに、何をするか、指定できます。

最も使う action がstore_truestore_falseです。

store_trueは、引数を使ってオプション設定されると、その引数にTrueを格納します。

下の例は、displayパラメータを作成し、引数でdisplay設定されると、displayパラメータにTrueを格納するコードです。

# test_action.py
import argparse

parser = argparse.ArgumentParser()

# actionで、動作を設定する。
parser.add_argument(
    '--display',
    default=False,
    action='store_true',
    )

args = parser.parse_args()
print(args)
if args.display:
    print(args.display)

displayオプション設定しない場合は、何も変わりません。

$ python test_action.py

Namespace(display=False)

displayオプションを設定すると、displayパラメータにstore_true(Trueが格納)されます。

$ python test_action.py --display

Namespace(display=True)
True

オプションが長いから短くする

ツールとして提供するときは、オプションを短くすると便利です。
short-optionsで、短いオプションにできます。

上のtest_action.pyのコードを改変し、displayオプション設定を短くしてみます

# test_action2.py
import argparse

parser = argparse.ArgumentParser()

# ハイフンひとつの短いオプションを追加する。
parser.add_argument(
    '-d',
    '--display',
    default=False,
    action='store_true',
    )

args = parser.parse_args()
print(args)
if args.display:
    print(args.display)

オプション設定を-dで行います。

$ python test_action2.py -d

Namespace(display=True)
True

ハイフン✕2のオプション設定も使用できます。

$ python test_action2.py --display

Namespace(display=True)
True