ArgumentParser
前回、sysモジュールを使ってコマンドライン引数を取得する方法を紹介しました。
今回はコマンドライン引数を処理する専用のライブラリ「ArgumentParserライブラリ」を紹介します。
sysモジュールでコマンドライン引数をArgumentParserを使うと場所でその引数の役割が決まる「位置引数」しか使えませんでした。
位置引数とは例えば「python test1.py arg1 arg2」というコマンドでtest1.pyを実行した際、arg1とarg2がそれぞれこの順番で意味のある引数となり、arg2、arg1の順番では処理が正しく行われなくなってしまう引数です。
コマンドライン引数にはもう一つ「キーワード引数」なるものが存在します。
キーワード引数は例えば「python test2.py -a arg1 –key arg2」のように「-a」や「–key」と言ったキーワードで指定される引数です。
こちらの場合はキーワードの直後に引数が記述されるため、順番が変わっていても正しく実行することができます。
今回紹介する「ArgmentParserライブラリ」では位置引数だけでなく、キーワード引数も使える、さらにはプログラムや引数の説明文も書くことができます。
ちなみに前回同様、実行はターミナル(Mac)やコマンドプロンプト(Windows)上ですのでお気をつけくださいませ。
それでは始めていきましょう。
基本的な使い方:必須引数
まずは一番基本的な使い方を見ていきましょう。
この使い方は前回紹介したsysモジュールとほぼ同じ使い方で必須引数であり、かつ位置引数を使う方法です。
import argparse
parser = argparse.ArgumentParser(description='description of the program')
parser.add_argument('arg1', help='required argument')
parser.add_argument('arg2', help='required argument')
args = parser.parse_args()
print(args.arg1)
print(args.arg2)
最初に「ArgmentParser」をインポートします(import argparse)。
そしてPaserを作成します(parser = argparse.ArgumentParser(description=’プログラム説明文’))。
この際、引数に「description」を記述しておくとヘルプページにどんなプログラムなのか表示することができます。
どのような表示になるかは後ほど紹介します。
次にコマンドライン引数を追加していきます(parser.add_argument(‘引数名’, help=’引数説明文’))。
この場合は追加した順番で位置引数となっていきます。
最後に引数を解析するコマンドを追加します(args = parser.parse_args())。
これで「args」の中にコマンドライン引数がまとめて格納され、それぞれを「parser.add_argument」で指定した「引数名」で取得できるようになります(args.arg1といった感じ)。
先ほどのプログラムで色々と試してみましょう。
引数なし
python argparse-1.py
実行結果
usage: argparse-1.py [-h] arg1 arg2
argparse-1.py: error: the following arguments are required: arg1, arg2
引数なしでは引数が足りないのでエラーとなりました。
引数1つ
python argparse-1.py test1
実行結果
usage: argparse-1.py [-h] arg1 arg2
argparse-1.py: error: the following arguments are required: arg2
引数1つでは引数が足りないため、エラーとなりました。
引数2つ
python argparse-1.py test1 test2
実行結果
test1
test2
引数2つが正しいので処理することができました。
引数3つ
python argparse-1.py test1 test2 test3
実行結果
usage: argparse-1.py [-h] arg1 arg2
argparse-1.py: error: unrecognized arguments: test3
引数3つでは多すぎるためエラーとなりました。
という感じで、足りなかったり多かったりするとエラーとなります。
次にヘルプを見てみましょう。
ヘルプを表示するには「python プログラム名.py -h」か「python プログラム名.py –help」を実行します。
出力は同じですので「python プログラム名.py -h」で試した結果を載せておきます。
python argparse-1.py -h
usage: argparse-1.py [-h] arg1 arg2
description of the program
positional arguments:
arg1 required argument
arg2 required argument
options:
-h, --help show this help message and exit
先ほど「description」や「help」に記載した内容が並べられて表示されました。
オプション引数
次にオプション引数を設定してみます。
先ほど引数名には「arg1」のように名前をそのまま書きましたが、オプション引数とする場合は「–引数名」のように前にハイフンを2つつなげて書きます。
import argparse
parser = argparse.ArgumentParser(description='description of the program')
parser.add_argument('--arg1', help='required argument')
parser.add_argument('--arg2', help='required argument')
args = parser.parse_args()
print(args.arg1)
print(args.arg2)
これでまた色々なパターンで実行してみましょう。
引数なし
python argparse-2.py
実行結果
None
None
エラーではなく、「–arg1」も「–arg2」も「None」となりました。
このようにオプション引数の場合、その引数が入力されないと「None」となります。
引数1つ
python argparse-2.py --arg1 test1
実行結果
test1
None
入力された引数はその値が、入力されていない引数は「None」となりました。
引数2つ
python argparse-2.py --arg1 test1 --arg2 test2
実行結果
test1
test2
両方の引数が表示されました。
オプション引数の省略形
オプション引数の場合、省略形を指定することも可能です。
その場合は「-a」のようにハイフンを1つつけ、1文字で引数名を指定します。
またこの場合、さらに「–arg」のようにハイフンを2つつけた省略しない引数名も同時に指定することも可能です。
import argparse
parser = argparse.ArgumentParser(description='description of the program')
parser.add_argument('-a', help='required argument')
parser.add_argument('-b', '--arg2', help='required argument')
args = parser.parse_args()
print(args.a)
print(args.arg2)
これを両方とも省略形の引数名を使って実行してみましょう。
python argparse-3.py -a test1 -b test2
実行結果
test1
test2
正常に実行することができました。
ただし注意点が一つあります。
先ほどのプログラムで省略形の引数名だけ(’-a’)を使った場合、その値を取得するには「args.a」と省略形を使って取得することができます。
しかし省略形の引数名と省略をしない引数名の両方を指定した場合(’-b’, ‘–arg2’)、省略形の引数名を使った値の取得はできないようです。
つまりこちらのプログラムはエラーになります。
import argparse
parser = argparse.ArgumentParser(description='description of the program')
parser.add_argument('-a', help='required argument')
parser.add_argument('-b', '--arg2', help='required argument')
args = parser.parse_args()
print(args.b)
python argparse-3.py -a test1 -b test2
実行結果
Traceback (most recent call last):
File "/Users/username/Desktop/Python/test/argparse/argparse-3.py", line 53, in <module>
print(args.b)
AttributeError: 'Namespace' object has no attribute 'b'
オプション引数を必須引数にする
次にオプション引数を必須引数にする方法です。
必須引数にするなら最初のハイフンなしの引数名でいいじゃ無いかと思われるかもしれませんが、オプション引数の場合、キーワードを書けば、どんな順番で書いてもいいというメリットがあります。
ということでオプション引数を必須引数にするには「required=True」のオプションを追加します。
import argparse
parser = argparse.ArgumentParser(description='description of the program')
parser.add_argument('-a', '--arg1', help='required argument', required=True)
args = parser.parse_args()
print(args.arg1)
引数なし
python argparse-4.py
実行結果
usage: argparse-4.py [-h] -a ARG1
argparse-4.py: error: the following arguments are required: -a/--arg1
オプション引数ですが必須になっているため、引数なしではエラーになります。
引数あり
python argparse-4.py -a test1
実行結果
test1
引数をつけると正しく処理されます。
オプション引数のデフォルト値の設定
オプション引数にデフォルト値を設定するには「default=’デフォルト値’」のオプションを追加します。
import argparse
parser = argparse.ArgumentParser(description='description of the program')
parser.add_argument('-a', '--arg1', help='required argument', default='TEST111')
args = parser.parse_args()
print(args.arg1)
引数なし
python argparse-5.py
実行結果
TEST111
引数あり
python argparse-5.py -a test1
実行結果
test1
ちなみに必須引数(ハイフンなしの引数名)の場合、必ず引数を入力する必要があるため、デフォルト値は設定できません。
import argparse
parser = argparse.ArgumentParser(description='description of the program')
parser.add_argument('arg1', help='required argument', default='TEST111')
args = parser.parse_args()
print(args.arg1)
python argparse-5.py
usage: argparse-5.py [-h] arg1
argparse-5.py: error: the following arguments are required: arg1
簡単に使うならsysモジュール、しっかり作り込むならArgmentParserでしょうか。
何にせよ思ったよりも簡単にコマンドライン引数を使うことができるので、今後使っていきたいと思いました。
次回からはPythonで簡単にGUIアプリを作成できるPySimpleGUIをいじっていきます。
ではでは今回はこんな感じで。
コメント