Python3 argparseを使って簡単にコマンドライン引数を取る

こんにちは、kisseです。  

今回は、Pythonでコマンドラインで動作させるツールでコマンドライン引数を扱い易くするためのargparseモジュールの紹介をします!

argparseモジュールとは

https://docs.python.jp/3/library/argparse.html
↑ ここらに記載があるように、コマンドラインインタフェースの作成を簡単にできるモジュールです。

普通、コマンドライン引数はsys.argvに格納され、自分でどのような引数が渡されたのかを判別しなくてはいけません。
しかし、argparseを使えば、簡単にコマンドライン引数を管理したり、–helpコマンドを作れたりします。



とりあえず実際につくってみよう

今回は、挨拶するプログラムを書いていきましょう!
‘greeting.py’という名称で以下のようなプログラムを作成してみます。

import argparse

if __name__ == '__main__':
  # descriptionにこのプログラムの簡単な説明を書く
  parser = argparse.ArgumentParser(description='Greeting!!')

  parser.add_argument('name', type=str, help='Your Name!')

  # -jや--japaneseが指定されたら、
  parser.add_argument('-j', '--japanese', action='store_true', help='Greeting with Japanese')

  # フラグを指定したら、その後に引数をとる
  parser.add_argument('-m', '--message', help='Custom greeting message')

  # 引数受け取り
  args = parser.parse_args()

  print(args)

  # 実際の処理を記述
  if args.message is not None:
    message = args.message
  elif args.japanese:
    message = 'こんにちは'
  else:
    message = 'Hello'

  if args.japanese:
    print(message + '、' + args.name + '。')
  else:
    print(message + ',' + args.name + '.')

では、早速このプログラムを動かしてみましょう。
まずは、よくある’-h’オプションを指定してみましょう.
すると以下のような使い方のメッセージが出てきます。

$ python greeting.py -h
usage: greeting.py [-h] [-j] [-m MESSAGE] name

Greeting!!

positional arguments:
  name                  Your Name!

optional arguments:
  -h, --help            show this help message and exit
  -j, --japanese        Greeting with Japanese
  -m MESSAGE, --message MESSAGE
                        Custom greeting message

argparseを使うと’-h’や’–help’オプションは自動で作成されます。
もちろんこれはカスタマイズできます。

このプログラムの必須の引数はnameです。
試しに、nameを指定しないで実行してみます。

$ python greeting.py
usage: greeting.py [-h] [-j] [-m MESSAGE] name
greeting.py: error: the following arguments are required: name

ちゃんと怒ってくれます。
しかも簡単な使い方を自動で出力してくれてます。

そしたら、次はちゃんとnameを指定してあげましょう.

$ python greeting.py kisse
Namespace(japanese=False, message=None, name='kisse')
Hello,kisse.

“Hello, kisse”って言ってくれるようになりました。
必須の引数を取るようにするには、

  parser.add_argument('name', type=str, help='Your Name!')

このように記述します。
add_argumentの第一引数はコマンドライン引数の名前です。
今回はnameという名前をつけました。
その次のtypeというキーワード引数は、与えられた文字列をどのように解釈するかを指定します。
これについてちゃんと解説すると、多分1記事分くらいの分量になってしまいます。
ここでは、与えられた文字列をそのまま文字列として解釈します。
他にもintを指定して整数として解釈させてみたり、自作の解釈用の関数を指定したりできます。



次はこの”Hello”の部分を変えてみましょう。
‘-m’もしくは’–message’フラグを指定して直後に挨拶文を指定すると、そのような挨拶をします。

$ python greeting.py kisse -m Hi
Namespace(japanese=False, message='Hi', name='kisse')
Hi,kisse.

オプション引数を取るようにするには、以下のように記述します。

  # フラグを指定したら、その後に引数をとる
  parser.add_argument('-m', '--message', help='Custom greeting message')

このようにすると、’-m’もしくは’–message’のあとの文字列をオプション引数として取ることができます。

次に、’-j’もしくは’–japanese’を指定すると日本語っぽく挨拶してくれます。

$ python greeting.py kisse -j
Namespace(japanese=True, message=None, name='kisse')
こんにちは、kisse。

こんな感じで表示してくれます。
ソースコードでは、

  # -jや--japaneseが指定されたら、
  parser.add_argument('-j', '--japanese', action='store_true', help='Greeting with Japanese')

という風に記載されています。
actionに’store_true’を指定すると、このオプションが指定された時には、Trueを格納します。
デフォルトでは、’store’が指定されていて、直後の文字列を引数として認識します。
先ほどの–messageのパターンですね。

  # 引数受け取り
  args = parser.parse_args()

parse_args()で辞書形式の引数リストが返ってきます。

このように入力が辞書で返ってくると、その後の処理の記述が楽になるので嬉しいですね。

おわり

今回は、この前触ったargparseの使い方を簡単に記載しました。
公式のドキュメントが一番詳しいのですが、ざっと使い方を調べたい時に不便なので、トピック的な記事を備忘録的に書いていこうかなと思います。

最後まで読んでいただきありがとうございます!



あわせて読みたい