Pythonのargparseモジュールを使ってコマンドライン引数を簡単にパースする方法

スポンサーリンク

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 parser
parser = 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.py
usage: argparse_example.py [-h] N
argparse_example.py: error: the following arguments are required: N
 
root@Ubuntu $ python argparse_example.py 10
Printing the integer
10
 
root@Ubuntu $ python argparse_example.py -h
usage: argparse_example.py [-h] N
 
A 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 hi
usage: argparse_example.py [-h] N
argparse_example.py: error: argument N: invalid int value: 'hi'

このモジュールは引数の型チェックを行い、 a が整数でなければならないこと、そして、プログラムが動作するためには適切な引数が渡されなければならないことを保証していることに注意してください。

これが type パラメータの意味です。

プログラムインターフェースに関するその他のオプション

パーサオブジェクトを作成する際に、さらに2つのオプションパラメータ、すなわち progusage を指定することで、プログラムにさらなるオプションを追加したり変更したりすることができます

フォーマット 形式: argparse.ArgumentParser(prog, usage, description).

  • prog -> プログラムの名前を指定します。(通常、デフォルトでは sys.argv[0] ですが、このパラメータで変更することができます。
  • usage -> ヘルプの文字列における使用法の書式を指定します。
  • prefix_chars -> オプション引数のプレフィックス文字を指定します (Unix システムでは - 、Windows では / です)。

これらをまとめるために、先ほどのスニペットを元に、この概念を説明するための簡単なコードを書いてみましょう。

import argparse
 
# Create the parser
parser = 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 argument
parser.add_argument('--integer', metavar='N',
                    type=int, help='an integer to be printed')
 
# Add a second string argument
parser.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=10
Argument Object: Namespace(integer=10, string=None)
Type of the Argument Object: <class 'argparse.Namespace'>
Printing the integer
10
Printing the string
None

他の場合の出力は、 argparse がどのように全てを引き受けてくれるかを示しています。

root@Ubuntu $ python3 argparse_example.py 10 Hello
Argument Object: Namespace(integer=10, string='Hello')
Type of the Argument Object: <class 'argparse.Namespace'>
Printing the integer
10
Printing the string
Hello
 
root@Ubuntu $ python3 argparse_example.py 10
usage: simple_printer [options] --integer --string
simple_printer: error: the following arguments are required: S
 
root@Ubuntu $ python3 argparse_example.py -h
usage: simple_printer [options] integer string
 
A 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 Hi
Argument Object: Namespace(integer=10, string='Hi')
Type of the Argument Object: <class 'argparse.Namespace'>
Printing the integer
10
Printing the string
Hi
 
root@Ubuntu $ python3 argparse_example.py --integer=10 --string=Hi
Argument Object: Namespace(integer=10, string='Hi')
Type of the Argument Object: <class 'argparse.Namespace'>
Printing the integer
10
Printing the string
Hi

2. オプションのパラメータに短い名前を使う

オプションの引数ごとに完全なパラメータ名を書くのを避けるために、スクリプトの中でハイフンでつながれたオプション(--optionではなく -o)を1つだけ使用することができます

argparse` を使用すると、パーサに引数を追加する際に、最初のパラメータとして短いオプション名を付けるだけで、このようなことが可能になります。

フォーマット parser.add_args('-o', '--option', help='シンプルなオプション') とします。

先ほどのスニペットでは、 --integer--string オプションの2つの小さな変更点を追加するだけです。

# Add an integer argument
parser.add_argument('-i', '--integer', metavar='N',
                    type=int, help='an integer to be printed')
 
# Add a second string argument
parser.add_argument('-s', '--string', metavar='S',
                    type=str, help='a string to be printed')

オプションの引数が短縮形で指定されている場合の出力。

root@Ubuntu $ python3 argparse_example.py -s=Hi
Argument Object: Namespace(integer=None, string='Hi')
Type of the Argument Object: <class 'argparse.Namespace'>
Printing the Integer
None
Printing the string
Hi
 
root@Ubuntu $ python3 argparse_example.py -s=Hi -i=10
Argument Object: Namespace(integer=10, string='Hi')
Type of the Argument Object: <class 'argparse.Namespace'>
Printing the integer
10
Printing the string
Hi

まとめ

この記事では、引数をパースするための argparse ライブラリの基本的な使い方と、 type パラメータによる型チェックを利用する方法について学びました。

また、オプションの引数をスクリプトに追加して、より使いやすくする方法についても、 usage とハイフンを使った引数名で学びました。

参考文献

  • Argparse ライブラリ ドキュメント
  • RealPythonのargparseに関するポスト
タイトルとURLをコピーしました