はじめに
Pythonの実行時にコマンドライン引数を取りたいときは,ArgumentParser (argparse)を使うと便利です。
様々な形式で引数を指定することができます。
初めてargparseを使おうとして調べていた時にいろいろな記事を読みましたが,細かいオプションまで解説している記事が多く,やりたいことの方法がすぐに分からなかった記憶があります。
そこで必要最低限な内容に絞り,読んですぐに使えるような記事を書きたいと思います。
ArgumentParserとは?
プログラム実行時にコマンドラインで引数を受け取る処理を簡単に実装できる標準ライブラリです。
ArgumentParserを使うと
$ python program.py test.txt --alpha 0.01
のように,プログラムで処理したいファイル名や何かのパラメータなどを実行時に指定できます。
つかいかた
基本形
大まかに
-
argparse
をインポートする - parserを作る
- 引数を設定する
- 解析する
といった処理をプログラム冒頭で実行します。
import argparse # 1. argparseをインポート
parser = argparse.ArgumentParser(description='このプログラムの説明(なくてもよい)') # 2. パーサを作る
# 3. parser.add_argumentで受け取る引数を追加していく
parser.add_argument('arg1', help='この引数の説明(なくてもよい)') # 必須の引数を追加
parser.add_argument('arg2', help='foooo')
parser.add_argument('--arg3') # オプション引数(指定しなくても良い引数)を追加
parser.add_argument('-a', '--arg4') # よく使う引数なら省略形があると使う時に便利
args = parser.parse_args() # 4. 引数を解析
print('arg1='+args.arg1)
print('arg2='+args.arg2)
print('arg3='+args.arg3)
print('arg4='+args.arg4)
実行例
$ python test.py input.txt output.txt --arg3 11111 -a 22222
arg1=input.txt
arg2=output.txt
arg3=11111
arg4=22222
引数なんだっけ?ってなった時に-h
または--help
を指定してヘルプ表示もできるようになります。
$ python test.py -h
usage: test.py [-h] [--arg3 ARG3] [-a ARG4] arg1 arg2
このプログラムの説明(なくてもよい)
positional arguments:
arg1 この引数の説明(なくてもよい)
arg2 foooo
optional arguments:
-h, --help show this help message and exit
--arg3 ARG3
-a ARG4, --arg4 ARG4
必須引数
add_argument
で引数名を'arg'
のように普通に指定するとこれになります。
実行時に引数を指定する順番が決まっているので指定し忘れるとエラーになります。
上の例のarg1
とarg2
がそうです。
オプション引数
引数名を'-a'
とか'--alpha'
のようにハイフン('-'
)を1~2個つけたものにするとこれになります。
ハイフンの数は,引数名が1文字のときは1つ,それ以上のときは2つ付けている(と思います)
実行時には指定してもしなくても良く(指定されなかった場合はNone
になる),指定する順番も自由です。
また,正式名称と略称(?)をつけられるのでよく使う引数なら両方あると便利です。
parser.add_argument('-i', '--input')
こうすると実行時には-i
と--input
のどちらを使っても指定できます。
ただしプログラム中では正式名称でしか参照できません。
例:
parser.add_argument('-i', '--input')
args = parser.parse_args()
print(args.input) # OK
print(args.i) # エラー
応用編
デフォルト値を指定したい!
オプション引数で指定されなかった場合はNone
になりますが,デフォルト値を指定することもできます。
parser.add_argument('--message', default='hello!')
上記の実行時に--message
が指定されていない場合はNone
の代わりに'hello!'
になります。
型指定したい!
コマンドライン引数で指定された値はデフォルトでは文字列型です。
→整数値や実数値を指定したい!
parser.add_argument('--number', type=int) # 整数値(int)
parser.add_argument('--alpha', type=float, default=0.01) # 実数値(float)
このようにすると,指定された値はint
やfloat
に自動で変換されます。
また,type
引数には文字列から所望の型に変換する関数を渡せば良いので他にもいろいろなことができます。
例:ピリオド'.'
区切りの数値を指定してリストで受け取りたい!
tp = lambda x:list(map(int, x.split('.')))
parser.add_argument('--address', type=tp, help='IP address')
args = parser.parse_args()
print(args.address)
実行例
$ python test.py --address 192.168.31.150
[192, 168, 31, 150]
フラグとして使いたい
add_argument
にaction
を指定するとフラグとして使えます。
parser.add_argument('--flag', action='store_true')
args = parser.parse_args()
print(args.flag)
$ python test.py
False
$ python test.py --flag
True
実行時に--flag
が指定されているとTrue
,そうでないときはFalse
になります。
引数として具体的な値を指定するのではなく,その引数を指定するorしないことに意味を持たせたい時に使えます。
ちなみにaction='store_false'
とすると逆になります(指定したらFalse
)
指定する内容を選択肢の中から選ばせたい!
parser.add_argument('--fruit', choices=['apple', 'banana', 'orange'])
choices
にリストを渡すと,引数の選択肢をその中にあるもののみに限定でき,それ以外を指定するとエラーになります。
ヘルプ(--help
)で何を指定できるか確認できます。
複数個(不定)受け取りたい
parser.add_argument('--colors', nargs='*')
args = parser.parse_args()
print(args.colors)
$ python test.py --colors red green blue
['red', 'green', 'blue']
nargs='*'
を指定すると可変長で複数個をリスト形式で受け取ることができます。
'*'
の代わりに整数を指定すると固定長にもできます。
オプション引数だけど必須指定にしたい
required=True
を指定すると必須指定のオプション引数を作ることができます。
私は上記の必須引数だと順序を忘れるので,好きな順序で指定できるこちらをよく使います。
parser.add_argument("-a", required=True)
args = parser.parse_args()
print(args.a)
$ python test.py -a hoge
hoge
$ python test.py
usage: test.py [-h] -a A
test.py: error: argument -a is required
おわりに
ここで紹介した以外にも様々な使い方があり,使いこなせば高度で柔軟な引数の解析が可能です。
公式ドキュメントや他の多くの記事で解説されているので調べてみると良いと思います。