Help us understand the problem. What is going on with this article?

ArgumentParserの使い方を簡単にまとめた

はじめに

Pythonの実行時にコマンドライン引数を取りたいときは,ArgumentParser (argparse)を使うと便利です。
様々な形式で引数を指定することができます。

初めてargparseを使おうとして調べていた時にいろいろな記事を読みましたが,細かいオプションまで解説している記事が多く,やりたいことの方法がすぐに分からなかった記憶があります。
そこで必要最低限な内容に絞り,読んですぐに使えるような記事を書きたいと思います。

ArgumentParserとは?

プログラム実行時にコマンドラインで引数を受け取る処理を簡単に実装できる標準ライブラリです。
ArgumentParserを使うと

$ python program.py test.txt --alpha 0.01

のように,プログラムで処理したいファイル名や何かのパラメータなどを実行時に指定できます。

つかいかた

基本形

大まかに
1. argparseをインポートする
2. parserを作る
3. 引数を設定する
4. 解析する
といった処理をプログラム冒頭で実行します。

test.py
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'のように普通に指定するとこれになります。
実行時に引数を指定する順番が決まっているので指定し忘れるとエラーになります。

上の例のarg1arg2がそうです。

オプション引数

引数名を'-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)

このようにすると,指定された値はintfloatに自動で変換されます。

また,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_argumentactionを指定するとフラグとして使えます。

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

おわりに

ここで紹介した以外にも様々な使い方があり,使いこなせば高度で柔軟な引数の解析が可能です。
公式ドキュメントや他の多くの記事で解説されているので調べてみると良いと思います。

kzkadc
機械学習&データ分析
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした