2016/05/25更新

[Python] argparseモジュールを使って、コマンドライン引数を本格的に扱う

このエントリーをはてなブックマークに追加      

こんにちは、@yoheiMuneです。
以前に[Python] コマンドライン引数を扱うsys.argvを使ったコマンドライン引数の扱い方を書きましたが、今回はargparseモジュールを使ってもっと本格的に扱う方法をブログに書きたいと思います。

画像

目次




argparseモジュールを導入する

argparseモジュールは最初から入っているモジュールなので、pipなどでのインストールは不要です。以下のインポートを行います。
import argparse
これで利用できるようになりました。

早速一番簡単な例で使ってみましょう。argparseモジュールは以下のように利用します。
# argparser_sample.py

# 引数パーサーの起動
parser = argparse.ArgumentParser()
parser.parse_args()
これでargparseが使えるようになりました。これだけで--help引数が使えるようになります。ちょっと便利ですね。
$ python3 argparser_sample.py --help
usage: argparser_sample.py [-h]

optional arguments:
  -h, --help  show this help message and exit
以降では、引数の具体的な使い方を見ていきたいと思います。



位置引数を使う

プログラムに必須のパラメータは位置引数(ポジショナル引数, Positional Arguments)で指定することができます。具体的には以下のようなコードを書きます。
# 位置引数の取得
parser = argparse.ArgumentParser()
parser.add_argument("date")
args = parser.parse_args()
print(args.date)
これで、以下のようにプログラムの第1引数に値を指定することで、それを受け取ることができます。
$ python3 argparser_sample.py 2016-05-12
2016-05-12
そしてこの位置引数は必須パラメータとなるので、以下のように引数なしで起動するとエラーになります。
$ python3 argparser_sample.py
usage: argparser_sample.py [-h] date
argparser_sample.py: error: the following arguments are required: date
また、ヘルプにも引数があることが表示されるようになります。
$ python3 argparser_sample.py -h
usage: argparser_sample.py [-h] date

positional arguments:
  date

optional arguments:
  -h, --help  show this help message and exit

これだけでも十分に使い易い(引数の存在チェックを自動的にしてくれるし、args.dateで引数の値にアクセスできる)のですが、以下のようにすることで、ヘルプ文言を追加することができます。
parser.add_argument("date", help="the target date for summrizing data.")
これで、ヘルプを表示すると以下のようになります。
$ python3 argparser_sample.py -h
usage: argparser_sample.py [-h] date

positional arguments:
  date        the target date for summrizing data.

optional arguments:
  -h, --help  show this help message and exit
またさらに、以下のように引数の型を指定することで、便利に使うことができます。
# 位置引数(型チェック指定あり)
parser = argparse.ArgumentParser()
parser.add_argument("square", 
                    help="display a square of a given value",
                    type=int)
args = parser.parse_args()
print(args.square**2)
ここではint型で受け取るようになります。
$ python3 argparser_sample.py 4
16    
そして、int型以外の引数を与えると、自動的にエラーにしてくれます。
$ python3 argparser_sample.py fourusage: argparser_sample.py [-h] square
argparser_sample.py: error: argument square: invalid int value: 'four'
この辺も、型チェックの実装を個別に書かなくていいのでとても便利です。



オプショナル引数を使う

オプショナル引数(Optional Arguments)を指定することで、任意のパラメータを取得することができます。具体的には以下のように実装します。
# Optional引数の導入
parser = argparse.ArgumentParser()
parser.add_argument("--date",
                    help="the date for summarizing date.")
args = parser.parse_args()
if args.date:
    print("args.date is defined. date = " , args.date)
else:
    print("args.date is undefined.")
ここでは、--dateパラメータが任意に指定することができます。
# 引数指定あり
$ python3 argparser_sample.py --date 2016-05-12
args.date is defined. date =  2016-05-12

# 引数指定なし
$ python3 argparser_sample.py
args.date is undefined.
また上記の実装の場合、--dateを指定したけど、それに続く値がない場合(以下例)はエラーにすることができます。
$ python3 argparser_sample.py --date
usage: argparser_sample.py [-h] [--date DATE]
argparser_sample.py: error: argument --date: expected one argument
そして、ヘルプにも上記で実装したオプショナル引数が記載されます。
$ python3 argparser_sample.py -h
usage: argparser_sample.py [-h] [--date DATE]

optional arguments:
  -h, --help   show this help message and exit
  --date DATE  the date for summarizing date.



オプショナル引数(値なし)を使う

オプショナル引数は、値を指定せずに使うこともできます。具体的には以下のような実装です。
# Optional引数の指定(値は指定せずオプションのみ指定)
parser = argparse.ArgumentParser()
parser.add_argument("--verbose",
                    help="increase output verbosity",
                    action="store_true")
args = parser.parse_args()
if args.verbose:
    print("verbosity turned on.", args.verbose)
この場合は、以下のようにプログラムを起動することができます。
$ python3 argparser_sample.py --verbose
verbosity turned on. True    



位置引数とオプショナル引数を併用する

位置引数とオプショナル引数は、以下のように併用することができます。
# 位置引数とOptionalの併用
parser = argparse.ArgumentParser()
parser.add_argument("date",
                    help="the date for summarizing date.")
parser.add_argument("--verbose",
                    help="increase output verbosity",
                    action="store_true")
args = parser.parse_args()
if args.verbose:
    print("the date specified is ", args.date)
else:
    print(args.date)
これを以下のように実行することができます。
$ python3 argparser_sample.py 2016-05-12 --verbose
the date specified is  2016-05-12

$ python3 argparser_sample.py 2016-05-12
2016-05-12

argparseモジュールは他にも、引数の排他的指定や引数のショートハンド指定などいろいろとできます。詳細は後続の参照先をごらんください。



参考資料

argparseモジュールの詳細は、以下を参照ください。

Argparse チュートリアル — Python 3.5.1 ドキュメント

16.4. argparse — コマンドラインオプション、引数、サブコマンドのパーサー — Python 3.5.1 ドキュメント



最後に

Pythonのコーディングは、このような機能を1つずつ学んで身につけていくことで着実にステップアップできるので、なかなかやりがいがあっていいです。今後も色々なPythonのことをこのブログで紹介できたらと思います。

最後になりますが本ブログでは、Python・Swift・Java・フロントエンド・機械学習など雑多に情報発信をしていきます。自分の第2の脳にすべく、情報をブログに貯めています。気になった方は、本ブログのRSSTwitterをフォローして頂けると幸いです ^ ^。

最後までご覧頂きましてありがとうございました!





こんな記事もいかがですか?

RSS画像

もしご興味をお持ち頂けましたら、ぜひRSSへの登録をお願い致します。