Pythonでコマンドラインスクリプトを書くとき、プログラムのコマンドラインオプションを追加する必要がある場面に出くわすことがあるかもしれません。
自分自身で引数の解析を行うのは、非常に面倒で時間がかかり、多くの場合、動作が遅くなりがちです。
Pythonの argparse モジュールはこの問題に対する解決策を提供します。
argparse` モジュールは、プログラマが良いコマンドラインインターフェイスを素早く簡単に書くための方法を提供します。
このライブラリを使って、どのようなスクリプトでも良いコマンドラインインターフェイスのオプションを提供できるか見てみましょう。
Python argparse ライブラリメソッド
このライブラリは、引数文字列を解析して処理し、ユーザーフレンドリーなコマンドラインオプションを追加するための様々なメソッドを提供しています。
1. 引数パーサーの作成
引数文字列を処理するために、まずパーサーを構築する必要があります。
ライブラリは引数パーサを構築するために argparse.ArgumentParser() を提供します。
形式は以下の通りです。
2. パーサーオブジェクトに引数を追加する
次のステップは、コマンドラインインターフェース(CLI)用のパーサーに引数/オプションを追加することです。
これは parser.add_argument() を使って行います。
フォーマット 形式: parser.add_argument(name, metavar, type, help).
- name -> パーサオブジェクトの属性名
- metavar -> オプションの引数として、ヘルプメッセージの中で別の名前を提供します。
- type -> 変数のデータ型 (
int,str, など) - help -> ヘルプメッセージにおける引数の説明です。
上記の概念を説明するための例
import argparse
# Create the parserparser = argparse.ArgumentParser(description='A Simple Program which prints to the console.')
parser.add_argument('integer', metavar='N', type=int, help='an integer to be printed')
args = parser.parse_args()
a = args.integer
print('Printing the integer')
print(a)
|
結果は以下の通りです。
root@Ubuntu $ python argparse_example.pyusage: argparse_example.py [-h] Nargparse_example.py: error: the following arguments are required: Nroot@Ubuntu $ python argparse_example.py 10Printing the integer10root@Ubuntu $ python argparse_example.py -husage: argparse_example.py [-h] NA Simple Program which prints to the console.
positional arguments: N an integer to be printed
optional arguments: -h, --help show this help message and exit
root@Ubuntu $ python argparse_example.py hiusage: argparse_example.py [-h] Nargparse_example.py: error: argument N: invalid int value: 'hi'
|
このモジュールは引数の型チェックを行い、 a が整数でなければならないこと、そして、プログラムが動作するためには適切な引数が渡されなければならないことを保証していることに注意してください。
これが type パラメータの意味です。
プログラムインターフェースに関するその他のオプション
パーサオブジェクトを作成する際に、さらに2つのオプションパラメータ、すなわち prog と usage を指定することで、プログラムにさらなるオプションを追加したり変更したりすることができます。
フォーマット 形式: argparse.ArgumentParser(prog, usage, description).
-
prog-> プログラムの名前を指定します。(通常、デフォルトではsys.argv[0]ですが、このパラメータで変更することができます。 -
usage-> ヘルプの文字列における使用法の書式を指定します。 -
prefix_chars-> オプション引数のプレフィックス文字を指定します (Unix システムでは-、Windows では/です)。
これらをまとめるために、先ほどのスニペットを元に、この概念を説明するための簡単なコードを書いてみましょう。
import argparse
# Create the parserparser = argparse.ArgumentParser(prog='simple_printer',
usage='%(prog)s [options] integer string',
description='A Simple Program which prints to the Console',
prefix_chars='-')
# Add an integer argumentparser.add_argument('--integer', metavar='N',
type=int, help='an integer to be printed')
# Add a second string argumentparser.add_argument('--string', metavar='S',
type=str, help='a string to be printed')
# Parse the list of arguments into an object# called 'args'args = parser.parse_args()
print('Argument Object:', args)
print('Type of the Argument Object:', type(args))
first_argument = args.integer
second_argument = args.string
print('Printing the integer')
print(first_argument)
print('Printing the string')
print(second_argument)
|
1. オプションの引数を渡す
引数の名前を --integer と --string に変更したことに注意してください。
これは、Pythonスクリプトでオプションの引数を指定する際の標準的な形式だからです。
argparseは–` を自動的に処理するので、一度だけタイプすればよいのです。
以下の出力は、これらの引数をパースするためにargparseを使用することの利便性を示しています。
オプションの引数に対する出力
root@Ubuntu $ python3 argparse_example.py --integer=10Argument Object: Namespace(integer=10, string=None)Type of the Argument Object: <class 'argparse.Namespace'>
Printing the integer10Printing the stringNone |
他の場合の出力は、 argparse がどのように全てを引き受けてくれるかを示しています。
root@Ubuntu $ python3 argparse_example.py 10 HelloArgument Object: Namespace(integer=10, string='Hello')
Type of the Argument Object: <class 'argparse.Namespace'>
Printing the integer10Printing the stringHelloroot@Ubuntu $ python3 argparse_example.py 10usage: simple_printer [options] --integer --stringsimple_printer: error: the following arguments are required: Sroot@Ubuntu $ python3 argparse_example.py -husage: simple_printer [options] integer stringA Simple Program which prints to the Console
optional arguments: -h, --help show this help message and exit
--integer N an integer to be printed
--string S a string to be printed
root@Ubuntu $ python3 argparse_example.py --integer 10 --string HiArgument Object: Namespace(integer=10, string='Hi')
Type of the Argument Object: <class 'argparse.Namespace'>
Printing the integer10Printing the stringHiroot@Ubuntu $ python3 argparse_example.py --integer=10 --string=HiArgument Object: Namespace(integer=10, string='Hi')
Type of the Argument Object: <class 'argparse.Namespace'>
Printing the integer10Printing the stringHi |
2. オプションのパラメータに短い名前を使う
オプションの引数ごとに完全なパラメータ名を書くのを避けるために、スクリプトの中でハイフンでつながれたオプション(--optionではなく -o)を1つだけ使用することができます。
argparse` を使用すると、パーサに引数を追加する際に、最初のパラメータとして短いオプション名を付けるだけで、このようなことが可能になります。
フォーマット parser.add_args('-o', '--option', help='シンプルなオプション') とします。
先ほどのスニペットでは、 --integer と --string オプションの2つの小さな変更点を追加するだけです。
# Add an integer argumentparser.add_argument('-i', '--integer', metavar='N',
type=int, help='an integer to be printed')
# Add a second string argumentparser.add_argument('-s', '--string', metavar='S',
type=str, help='a string to be printed')
|
オプションの引数が短縮形で指定されている場合の出力。
root@Ubuntu $ python3 argparse_example.py -s=HiArgument Object: Namespace(integer=None, string='Hi')Type of the Argument Object: <class 'argparse.Namespace'>Printing the IntegerNonePrinting the stringHiroot@Ubuntu $ python3 argparse_example.py -s=Hi -i=10Argument Object: Namespace(integer=10, string='Hi')Type of the Argument Object: <class 'argparse.Namespace'>Printing the integer10Printing the stringHi |
まとめ
この記事では、引数をパースするための argparse ライブラリの基本的な使い方と、 type パラメータによる型チェックを利用する方法について学びました。
また、オプションの引数をスクリプトに追加して、より使いやすくする方法についても、 usage とハイフンを使った引数名で学びました。
参考文献
- Argparse ライブラリ ドキュメント
- RealPythonのargparseに関するポスト