Pythonのargparseの使い方【オプション解析】
目次
- Pythonのargparseの使い方
- プログラムの引数とオプション
- argparseの大まかな使い方
- ArgumentParserをオブジェクトにする
- add_argument()で引数の定義を追加する
- parse_args()で引数を解析する
- 解析結果(
args
)を使用する - おわりに
Pythonのargparseの使い方
Pythonにはプログラムのオプションなどを解析できる標準ライブラリargparseがあります。
このライブラリを使うと簡単にプログラムの引数を解析できます。
この記事ではPythonのargparse
の使い方をわかりやすく解説します。
結論から言うとargparse
は↓のように使います。
import argparse parser = argparse.ArgumentParser('mycmd', description='これはサンプルプログラムです。') parser.add_argument('words', nargs='+', help='単語のリストです。') parser.add_argument('-j', '--join', type=str, help='単語を連結します') args = parser.parse_args() # $ python intro.py cat dog --join : print(args.words) # ['cat', 'dog'] print(args.join) # : print(args.join.join(args.words)) # cat:dog
具体的には↓の項目を見ていきたいと思います。
プログラムの引数とオプション
argparseの大まかな使い方
ArgumentParserをオブジェクトにする
add_argument()で引数の定義を追加する
parse_args()で引数を解析する
解析結果(args)を使用する
プログラムの引数とオプション
プログラムにもいろいろありますが、WindowsのコマンドプロンプトやUNIX系で使われるBashなどのシェルに、コマンドを書いて実行するプログラムを一般に「コマンド」とか「CLIのプログラム」と言います。
コマンドと言うのは例えば↓のようなものです。
$ mycmd
↑の場合、mycmd
というのがコマンドで、プログラムです。
↑は引数を何も指定していない状態です。
このmycmd
に引数を指定する場合は↓のようにします。
$ mycmd arg1 arg2
引数は複数指定でき、コマンドはその引数を受け取ってプログラムの振る舞いを変えます。
またオプションというのもプログラムの振る舞いを変えるものです。
UNIX系のコマンドのオプションは-
か--
で始まるキーワードです。
-
がショートオプションで--
がロングオプションと呼ばれます。
つまり↓のようなものがオプションです。
$ mycmd -o --opt1
オプションは単独で指定出来たり、そのオプションに引数を与えることも出来ます。
$ mycmd --opt optarg $ mycmd --opt=optarg
今回解説するargparse
は↑のようなコマンドの引数やオプションを解析してくれるものです。
argparse
を使うと簡単にこれらの解析結果が利用できます。
覚えることはちょっと多いですが、慣れてしまえば非常に楽に使えます。
argparseの大まかな使い方
argparse
の大まかな使い方を先に示します。
argparse
は↓のように使います。
argparseをインポートする
ArgumentParserをオブジェクトにする
add_argument()で引数の定義を追加する
parse_args()で定義に従ってプログラムの引数を解析する
解析結果を使ってプログラムの振る舞いを変える
まずargparse
をインポートしたらargparse.ArgumentParser
というクラスをオブジェクトにする必要があります。
このオブジェクトに引数の定義を追加していって、解析を行わせ、その解析結果を利用します。
add_argument()
はArgumentParser
のメソッドでこのメソッドで引数の定義を追加します。
parse_args()
も同様で、このメソッドはプログラムの引数を追加された定義に従って解析します。
parse_args()
は解析結果をオブジェクトとして返します。
このオブジェクトに保存されている解析結果、つまり引数の値やオプションの値を利用してプログラムの振る舞いを変えるという感じになります。
ArgumentParserをオブジェクトにする
最初にargparse
をインポートします。
import argparse
そしてargparse
のArgumentParser
をオブジェクトにします。
この時、第1引数にはプログラムの名称を指定します。
description
キーワード引数にはプログラムの説明を書きます。
オブジェクトのprint_help()
を呼び出すとこれらがどのように表示されるのか確認することができます。
parser = argparse.ArgumentParser('mycmd', description='これはプログラムの説明です') parser.print_help() # # usage: mycmd [-h] # # これはプログラムの説明です # # optional arguments: # -h, --help show this help message and exit
add_argument()で引数の定義を追加する
ArgumentParser
をオブジェクト(parser
)にしたら、このオブジェクトのadd_argument()
メソッドを使って引数を定義します。
定義は複数追加することが可能です。
引数の定義例を↓に示します。
引数を1つだけ取る
引数を1つだけ取るようにしたい場合は↓のように定義します。
parser.add_argument('myarg', type=str, help='プログラムの引数です')
myarg
というのは解析結果の変数名になります。
type=str
とすることで引数のタイプが文字列だと明示しています。
help
にはその引数の説明を書くことができます。
この引数の定義は↓のようなコマンドに対応します。
$ mycmd abc
引数を複数取る
引数を複数取るようにしたい場合は↓のように定義します。
parser.add_argument('myargs', type=str, nargs='+', help='プログラムの引数です')
nargs
に+
を指定すると「1個以上の引数を取る」という定義になります。
これが*
だと「0個以上の引数を取る」という定義になります。
この定義だとmyargs
の値はリストになります。
またコマンドは↓のようなものに対応します。
$ mycmd abc def ghi
オプションを定義する
ショートオプションとロングオプションを定義する場合は↓のようにします。
parser.add_argument('-m', '--myopt', action='store_true', help='プログラムのオプションです')
↑の定義の場合、解析結果の変数はmyopt
になります。
↑の場合-m
か--myopt
が指定されたら解析結果のmyopt
の値がTrue
になります。
action
にはオプションが指定されたときの振る舞いを書くことができます。store_true
は「True
を保存しろ」という意味です。
コマンドは↓のようになります。
$ mycmd -m $ mycmd --myopt
ちなみにショートオプションやロングオプションは互いに省略することができます。
parser.add_argument('-a', action='store_true') parser.add_argument('--bbb', action='store_true')
ショートオプションのみの場合は↑の場合a
と言う変数に解析結果が保存されます。
オプションに値を設定したい場合は↓のようにします。
parser.add_argument('--file', type=str)
コマンドは↓のようになります。
$ mycmd --file /tmp/abc.txt
parse_args()で引数を解析する
ArgumentParser
のparse_args()
を呼び出すとプログラムの引数が解析されます。
args = parser.parse_args()
このメソッドの返り値は解析結果です。
引数やオプションの値がここに保存されています。
解析結果(args
)を使用する
解析結果を利用するサンプルを↓に示します。
import argparse parser = argparse.ArgumentParser('upperjoin', description='単語を連結します。') parser.add_argument('words', nargs='+', help='単語のリストです。') parser.add_argument('-j', '--join', type=str, help='単語を連結します') parser.add_argument('--upper', action='store_true', help='単語を大文字にします') args = parser.parse_args() words = args.words if args.upper: words = [w.upper() for w in words] if args.join: result = args.join.join(words) print(result) # $ python upperjoin.py arg1 arg2 --upper --join : # ARG1:ARG2 else: print(words) # $ python upperjoin.py arg1 arg2 # ['arg1', 'arg2']
↑のプログラムは引数に指定された文字列を整形します。
オプション--upper
が指定されている場合は文字列を大文字にし、--join
が指定されている場合は文字列をセパレーターで結合します。
おわりに
今回はPythonのargparse
の使い方を解説しました。
argparse
は使い慣れると非常に使いやすいライブラリと言えます。
オプションの解析はこれに任せましょう。
(^ _ ^) | オプションはプログラムを豊かにする |