Pythonのargparseモジュールでコマンドライン引数を解析する方法
はじめに
コマンドラインからPythonスクリプトを実行する際、引数を渡す必要がある場面は非常に多くあります。しかし、必要なパラメータが指定されない、あるいは数・型・順序が合わない場合、スクリプトは例外を発生させます。そこで重要になるのが、コマンドライン引数を適切に解析(パース)する仕組みです。
Python標準ライブラリのargparseモジュールは、とても使いやすいコマンドラインインターフェース(CLI)を作成するためのツール群を提供します。sys.argvリストから引数を取り出して解析する処理、ヘルプメッセージの自動生成、無効なオプションが指定されたときのエラー表示などを自動的に担ってくれます。
パーサーオブジェクトの作成
コマンドラインインターフェースを設計する最初のステップは、パーサーオブジェクトのセットアップです。これはargparseモジュールのArgumentParser()関数で行います。descriptionパラメータに説明文の文字列を渡すこともできます。
まず、スクリプトをコマンドラインから引数なしで実行してみましょう。パーサーオブジェクトのparse_args()メソッドを呼び出しますが、引数が何も与えられていないため、実際には何も処理を行いません。
import argparse parser = argparse.ArgumentParser(description="sample argument parser") args=parser.parse_args()
上記スクリプトを実行すると、次のようになります。
C:\python36>python argparser1.py C:\python36>python argparser1.py --help usage: argparser1.py [-h] sample argument parser optional arguments: -h, --help show this help message and exit
2つ目のコマンドでは--helpオプションを指定しており、このようにヘルプメッセージが表示されます。-h/--helpパラメータはデフォルトで利用可能です。
必須の位置引数を定義する
次に、スクリプトの実行に必須となる引数を定義します。引数が指定されなかった場合にはエラーが発生します。ここではadd_argument()メソッドを使って「user」という引数を定義しています。
import argparse
parser=argparse.ArgumentParser(description="sample argument parser")
parser.add_argument("user")
args = parser.parse_args()
if args.user=="Admin":
print("Hello Admin")
else:
print("Hello Guest")この状態でヘルプを表示すると、「user」という位置引数が確認できます。プログラムはその値が「Admin」かどうかを判定し、対応するメッセージを出力します。
C:\python36>python argparser1.py --help usage: argparser1.py [-h] user sample argument parser positional arguments: user optional arguments: -h, --help show this help message and exit C:\python36>python argparser1.py Admin Hello Admin C:\python36>python argparser1.py temp Hello Guest
引数にデフォルト値を設定する
add_argument()メソッドでは、引数にdefault値を設定することができます。
import argparse
parser=argparse.ArgumentParser(description="sample argument parser")
parser.add_argument("user", nargs='?', default="Admin")
args=parser.parse_args()
if args.user=="Admin":
print("Hello Admin")
else:
print("Hello Guest")ここでnargsは、コマンドラインから読み込むべき引数の個数を表します。「?」を指定すると、可能であれば1つの引数をコマンドラインから取得して単一の値として返し、引数が存在しない場合はdefaultの値が使用されます。
C:\python36>python argparser1.py Hello Admin C:\python36>python argparser1.py Admin Hello Admin C:\python36>python argparser1.py test Hello Guest
引数の型を明示的に指定する
デフォルトでは、すべてのコマンドライン引数は文字列として扱われます。引数の型(type)を明示的に指定したい場合は、add_argument()メソッドのtypeパラメータを使用します。Pythonのすべてのデータ型がtypeの値として有効です。
import argparse
parser=argparse.ArgumentParser(description="add numbers")
parser.add_argument("first", type=int)
parser.add_argument("second", type=int)
args = parser.parse_args()
x = args.first
y = args.second
z = x + y
print('addition of {} and {} = {}'.format(x, y, z))
C:\python36>python argparser2.py 2 3
addition of 2 and 3 = 5オプション引数を追加する
これまでの例の引数はすべて必須でした。オプション引数を追加するには、引数名の前にダブルダッシュ(--)を付けます。次の例では--surnameと指定しているため、surname引数は省略可能になります。
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("name")
parser.add_argument("--surname")
args = parser.parse_args()
print("My name is ", args.name, end=' ')
if args.surname:
print(args.surname)さらに、一文字の名前の前にシングルダッシュ(-)を付けると、短縮名オプションとして機能します。
C:\python36>python argparser3.py Malhar
My name is Malhar
C:\python36>python argparser3.py Malhar --surname Lathkar
My name is Malhar Lathkar
parser.add_argument("-s","--surname")choicesで入力値を選択肢に限定する
引数があらかじめ定義されたリストの中の値だけを受け付けるようにしたい場合は、choicesパラメータを使用します。
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("sub", choices=['Physics', 'Maths', 'Biology'])
args=parser.parse_args()
print("My subject is ", args.sub)なお、指定した値がリストに含まれていない場合は、invalid choice(無効な選択)エラーが表示されます。
C:\python36>python argparser4.py Physics
My subject is Physics
C:\python36>python argparser4.py English
usage: argparser4.py [-h] {Physics,Maths,Biology}
argparser4.py: error: argument sub: invalid choice: 'English' (choose from 'Physics', 'Maths', 'Biology')まとめ
argparseモジュールを活用すれば、必須・オプションの引数定義、デフォルト値の設定、型変換、選択肢の制限といった処理を簡潔に実装できます。ヘルプやエラーメッセージも自動生成されるため、堅牢でユーザーフレンドリーなCLIツールの開発にぜひ役立ててください。
-
コマンドラインから操作するPython Matplotlibのインタラクティブプロット入門
Matplotlibでインタラクティブなプロットを実現するには、図(figure)をアクティブな状態にしておく必要があります。plt.ioff() と plt.ion() を使い分けることで、プロットに対するインタラクティブな操作の有効・無効を自由に切り替えることができます。 それでは、IPython シェルを起動し、以下のコマンドを順番に入力して動作を確認してみましょう。 実行例 In [1]: %matplotlib auto Using matplotlib backend: GTK3Agg In [2]: import matplotlib.pyplot as In [3]: fi
-
PythonでTkinterボタンのコマンド(イベントハンドラ)を動的に変更する方法
TkinterのButtonウィジェットは、アプリケーション内で特定の操作を実行するためのイベントを処理する役割を担っています。こうしたイベントに対応するには、通常、実行したい処理をまとめたメソッド(関数)を定義し、ボタンのcommandオプションに割り当てます。しかし、ボタンを作成した後から、クリック時に実行される処理(イベントメソッド)を変更したい場合もあるでしょう。そんなときに便利なのが、configure(options)メソッドです。このメソッドを使えば、ボタンウィジェットの設定を後から自由に再構成でき、新しいメソッドを定義してボタンに割り当てることで、同じボタンでも状況に応じてまっ