argparseによるコマンドライン引数の取得

目的

ここまでは,統合開発環境であるPyCharmでPythonコードを実行した.コードを作る際には統合開発環境で実行することが多いが,出来上がったコードはコマンドラインで実行することが多い.特に条件を変えてコードを実行するときには,コマンドライン引数で情報を指定することになる.ここでは,argparseモジュールを使用したコマンドライン引数の取得方法を学ぶ.

説明

コマンドラインでの実行とコマンドライン引数

コマンドラインでのPythonファイルの実行

例えば,以下のように1と2を加算し,結果を表示するadd.pyという名前のPythonファイルがあるとする.

このPythonファイルをコマンドラインで実行するには,terminalを開く必要がある.PyCharmからterminalを開くには以下のようにすればよい.

  • テータスバーの上の「Terminal」をクリックする.
    • Terminalがツールウィンドウとして表示される.
    • 入力用のプロンプト(環境によって異なるため,ここでは「$」とする)が表示される.

プロンプト「$」の後に,以下のように入力すると,

以下のように実行結果が出力されるはずである.

コマンドライン引数による情報の指定

先程のPythonコードは1と2を加算するものであった.異なる数値(例えば3と4や5と6)を加算するには,その都度コードを書き換える必要があるため手間がかかる.そこで,コマンドラインで実行する際にコマンドライン引数として数値を指定することで,コードを書き換えずに加算できるようにしたい.例えば,以下のように2つの数値を半角スペースで区切って指定できるようにすると便利である.このとき,半角スペースで区切って指定した情報をコマンドライン引数と呼び,前から順に第1引数,第2引数と呼ぶ.

argparseモジュールを用いたコマンドライン引数の解析と取得

Pythonでコマンドライン引数(argument)を解析(parse)したり取得したりする際には,argparseモジュールが使用されることが多い.ここではargparseモジュールの使い方を説明する.

コマンドライン引数を取得する

では,2つの数値を加算するコードを書き換え,コマンドライン引数で指定した2つの整数値を加算できるようにしよう.argparseモジュールを使用すると,例えば以下のように書き換えればよい.

1行目でargparseモジュールをインポートし,5行目でargparseモジュールのArgumentParserクラスのオブジェクトを生成し,parserという名前とつけている.このオブジェクトのadd_argumentメソッドを呼び出すと,コマンドライン引数を追加できる.3,4行目では,opperand0とopperand1という名前のコマンドライン引数を追加している.また,今回は2つの整数値を加算することにするので,コマンドライン引数で取得するデータの型をintとしている.次に,8行目でparse_argsメソッドを呼び出し,受け取ったコマンドライン引数を解析(parse)し,解析した結果にargumentsという名前をつけている.解析結果であるargumentsオブジェクト内の変数「operand0」と「operand1」(6,7行目で指定したコマンドライン引数名)に2つの整数値が保存されるため,10行目のように記述すれば加算した結果が求められ,11行目のように記述すれば2つの整数値と加算結果を表示することができる.

Pythonファイル名が「add_arguments.py」だとし,例えば,以下のように実行すると正しく実行されていることが確認できる.

コマンドライン引数を正しく指定しなかった場合

では,コマンドライン引数を正しく指定せずに実行するとどうなるか確認しよう.引数を指定せずに実行すると,以下のように,使い方(usage)とエラー(2つの引数operand0とoperand1が必要であること)が表示される.

ヘルプメッセージの表示

また,以下のように,–helpオプション(あるいは-hオプション)を指定して実行すると,より詳しい使い方が表示される.positional argumentsとは位置引数のことで,ここでは第1引数operand0と第2引数operand1のことを指す.optional argumentsとはオプションで指定できる引数で,「-h」や「–help」を指定して実行すると,ヘルプメッセージが表示されることが説明されている.

では,先程のコードを以下のように書き換え,

-hオプションを指定して実行し,ヘルプメッセージを表示してみよう.

add_argumentメソッドのキーワード引数helpで指定した各コマンドライン引数の説明文がヘルプメッセージに表示されていることがわかる.

コマンドライン引数を指定するようにしたコードでは,実行するときに正しくコマンドライン引数を指定する必要がある.argparseを使用すると,正しく指定できていない場合に簡単な使い方が表示される.また,使い方がわからないときは,実行するときに–helpオプションを指定すれば使い方が確認できる.

引数でファイル名を指定して静止画像を表示する

では,別の例でargparseの使用方法を説明しよう.ここでは,コンピュータに保存されている静止画像ファイルを読み込んで表示するPythonコードを例に説明する.例えば,「input_image.png」という静止画像ファイルを読み込み,ウィンドウに表示するコードは以下のようになる.

この例ではコード中にファイル名を直接書き込んでいるが,1つのコードで様々な画像を読み込んで表示できるほうがよいので,コマンドライン引数でファイル名を指定できるように書き換えよう.

2つの整数値を加算する例では,add_argumentメソッドのキーワード引数typeでint型を指定した.今回の例では,文字列を指定することになるが,add_argumentメソッドで追加する引数の型がデフォルトで文字列であるため,今回は指定していない.それ以外は整数値を加算する例と同じである.

引数で解像度を指定する

次に,読み込んだ画像の解像度を変えてみよう.解像度もコード中に記述するのではなく,コマンドライン引数で指定できるようにしよう.例えば以下のように記述すると,元の画像と解像度を変更した画像を表示できる.

オプションで解像度を指定する

以上の例では必ず指定する必要があるコマンドライン引数の使い方を学んだ.ここでは必ずしも指定する必要がないオプション引数の使い方を学ぶ.ここでは,解像度をオプションで指定するように書き換えてみよう.

8,9行目のように,コマンドライン引数名の先頭に「–」をつけるとオプション引数を指定したことになる.また,オプション引数は指定されないことがあるため,その場合に使用するデフォルト値をキーワード引数defaultで指定することができる.ここでは,解像度のデフォルト値を160×120としている.

Pythonファイル名が「resize_optional_arguments.py」だとし,例えば以下のように実行すると指定した解像度の画像が表示される.

1行目では解像度320×240の画像が表示される.オプション引数は位置に意味がないので,2行目のように順番を入れ替えても解像度320×240の画像が表示される.3行目のように指定しないとデフォルト値である解像度160×120の画像が表示される.4,5行目のようにどちらか一方しか指定しない場合も,もう片方はデフォルト値となるため,4行目では解像度320×120の画像が,5行目では160×240の画像が表示される.

短いオプション名で解像度を指定する

また,オプション引数では短い引数名を指定できる.

8,9行目のように先頭に「-」をつけると短いオプション引数名を指定したことになる.8行目ではwidthの先頭のwを短いオプション引数名に指定している.「-h」は「–help」オプションとともに既に使われていて使用できないため,9行目のheightは先頭の2文字heを短いオプション引数名としている.

Pythonファイル名が「resize_short_optional_arguments.py」だとし,例えば以下のように実行すると指定した解像度の画像が表示される.

候補の中から選択して解像度を指定する

オプション引数は複数の候補の中から選択して指定することも可能である.例えば,解像度をQVGA(320×40),VGA(640×480),SVGA(800×600)の中から選択するようにするには,以下のように記述すればよい.

8行目のadd_argumentメソッドでresolutionという名前のオプション引数を追加している.このとき,キーワード引数choicesで3種類の解像度を表す文字列qvga, vga, svgaから選択するようにし,デフォルト値をqvgaとしている.12行目から20行目で引数名resolutionに保存されている文字列がqvga, vga, svgaのいずれかに応じて解像度の値を設定している.

Pythonファイル名が「resize_optional_arguments_choice.py」だとし,例えば以下のように実行すると指定した解像度の画像が表示される.

1行目ではVGAの解像度の画像が,2行目ではSVGAの解像度の画像が,3行目ではデフォルト値のQVGAの解像度の画像が表示される.

フラグを指定してグレースケール画像を表示する

状態をオンやオフに変更することで,情報を指定するものをフラグと呼ぶ.ここでは,オプション引数でフラグを指定し,フラグをオンにするとカラー画像をグレースケール画像に変換して表示できるようにしてみよう.

8,9行目で,オプション引数grayを追加し,キーワード引数actionで「store_true」を指定している.これは,オプション引数grayが指定されたときに変数にTrueの値が入る(指定されないとFalseの値が入る)ことを意味する.13行目で変数grayの値を確認し,Trueの場合にだけグレースケールに変換する処理を行っている.

Pythonファイル名が「display_image.py」だとし,例えば以下のように実行すると,指定したオプションによりカラー画像かグレースケール画像が表示される.

1行目,2行目のように実行するとグレースケール画像が,3行目のように実行するとカラー画像が表示される.

任意の数のファイル名を指定して静止画像を表示する

argparseは引数の数が決まっていない場合にも使用できる.例えば,コマンドライン引数で,1つの画像ファイル名を指定したら1つの画像が,2つの画像ファイル名を指定したら2つの画像を表示したい.そのような場合には以下のように記述すればよい.

7行目のようにadd_argumentメソッドのキーワード引数nargsに「+」を指定すると,1つ以上の引数を指定することができる.「*」を指定すると0個以上の引数を指定できるが,今回のコードでは0だと意味がないので,1つ以上としている.指定した複数のファイル名はリストの形式で変数に保存される.そのため,10行目のようにリストに対する繰り返しを行い,複数枚の画像を順に表示できるようにしている.

Pythonファイル名が「display_images.py」だとし,例えば以下のように実行すると,指定したファイル名の画像が順に表示される.

課題

課題0

コマンドライン引数で身長を指定すると,標準体重を表示するプログラムを作成せよ.

課題1

コマンドライン引数で身長と体重を指定すると,BMIを表示するプログラムを作成せよ.

課題2

コマンドライン引数で名前と年齢と趣味を指定すると,自己紹介文を表示するプログラムを作成せよ.

課題3

コマンドライン引数で秒数を指定すると,時間と分と秒に変換し,表示するプログラムを作成せよ.

課題4

コマンドライン引数で英語・数学・国語のテストの点数を指定すると,最も良かった教科の点数と最も悪かった教科の点数と平均点を表示するプログラムを作成せよ.

課題5

コマンドライン引数で英語・数学・国語の試験の点数(100点満点)と換算したい満点の点数を指定すると,換算した結果を表示するプログラムを作成せよ.換算したい満点の点数の指定を省略すると50点満点に換算されるようにせよ.

課題6

コマンドライン引数で画像ファイル名と解像度を指定すると,指定された解像度で画像が表示されるプログラムを作成せよ.解像度はオプションで指定できるようにすること.

課題7

コマンドライン引数で画像ファイル名と解像度を指定すると,指定された解像度で画像が表示されるプログラムを作成せよ.解像度はVGA等の名前がついているものの中から指定できるようにすること.

課題8

コマンドライン引数で画像ファイル名のみを指定するとカラー画像が,画像ファイル名とフラグを指定するとグレースケール画像が表示されるプログラムを作成せよ.

課題9

コマンドライン引数で複数の画像ファイル名を指定すると,順に画像が表示されるプログラムを作成せよ.