ちょっとしたコマンドラインツールをpythonで作る時に便利なargparseの使い方

ちょっとしたコマンドラインツールを作るとき、欲しくなるのが以下のようなカッコイイオプション指定機能とヘルプ表示。

pythonなら、標準パッケージargparseを使うことで、簡単に実装できます。

スクリプトの引数仕様

例えば、とあるスクリプトの引数をこんな感じで指定できるようにしたい。

  • srcディレクトリパスの指定は必須
  • dstディレクトリパスの指定は必須ではない
  • 対象とするファイルの拡張子を複数指定したい
  • debug用のprint文は普段はstdoutに出したくない

まずは初期化

ArgumentParserオブジェクトを生成します。

その初期化パラメータは、description以外はデフォルトのままで問題ありません。add_help(-h/–help オプションをパーサーに追加する)等、便利な機能は予め有効になっています。

引数の追加

その1

> srcディレクトリパスの指定は必須

add_argumentの第一引数にpath_root_srcを、nargsにNoneを指定します。この名前に、-や–を付けないのがミソです。

こうすることで、-や–付オプション以外の引数がスクリプトに指定されないと、too few argumentエラーとなってくれます。

もしnargsを’?’にした場合は、引数の数0個を許可したことになるので、エラーになることなくスクリプトを実行できることになります。ただし、その際はdefaultやconstの設定が必要になります。詳しくは後ほど。

ここで指定した第一引数の文字列’path_root_src’は、最後の仕上げでコールするargs = parser.parse_args()が返すNamespaceオブジェクトの属性名として使用されます。

つまり、下記のように実行した場合、args.path_root_srcに””/Users/test/Pictures””が格納されることになります。

その2

> dstディレクトリパスの指定は必須ではない

add_argumentの第一引数に2種類のオプション文字列を、nargsに’?’を指定することで実現可能です。

これにより、可能なら1つの引数がコマンドラインから取られ、args = parser.parse_args()が返すNamespaceオブジェクトの属性名’path_root_dst’として使用され、引数の値はその属性にセットされます。

オプション引数そのものが存在しない(-d自体が指定されない)場合はdefaultの値が渡されます。

それに対し、オプション引数が指定され、その後にコマンドライン引数が無い場合は、constの値が渡されます。

下記の例の場合、どちらもNoneなので同じことですが…。

その3

> 対象とするファイルの拡張子を複数指定したい

add_argumentの第一引数に2種類のオプション文字列を、nargsに’+’を指定することで実現可能です。

nargsに’+’を指定すると、最低でも1つのコマンドライン引数が必要となり、条件を満たさない場合はtoo few argumentエラーとなります。

ただし、too few argumentエラーとなるのは、オプションが指定されているのにコマンドライン引数が指定されていない場合のみです。
オプション自体が指定されていない場合は、defaultに指定した['jpg']が使用され、エラーになりません。

その4

> debug用のprint文は普段はstdoutに出したくない

あるオプション引数が指定された場合、単純にTrueかFalseの値を持ちたい場合、actionに’store_true’や’store_false’を指定することで実現できます。

このスクリプトが–debug付きで実行された場合は、最後の仕上げでコールするargs = parser.parse_args()が返すNamespaceオブジェクトの属性名args.debugにTrueが格納されることになります。

最後の仕上げ

以下のようにすると、これまでに指定した引数設定を元にして、コマンドラインで指定された引数をNamespaceオブジェクトの属性に変換して返します。

下記のようにparse_args()関数の引数を省略しても結果は同じです。

こうしてできたargsオブジェクトをダンプしてみると、以下のように属性値として格納されていることがわかります。

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする