Techniical-support

Pythonでコマンドライン引数が受け取れるコマンドを作成してみる

こんにちは
最近プログラミングの機会がちょこっと増えてるSRE課の栩野です。

Pythonでコマンドライン引数が受け取れるコマンドを作成してみる

Pythonで作成したコードを、Linuxコマンドみたいにコマンドライン引数を受け取って
コマンド化したいなー、と思って調べてみたところ...
argparseという超便利なモジュールが存在してました!

実際にargparseを使ってコマンドを作成してみるとかなり便利だったので
今回はその使い方を紹介してみようと思います。

argparseでPythonコマンドを作る

検証環境

  • Python 3.6.5
    (Python2.7から実装されたモジュールのようなので、それ以降であれば動作すると思います。)

まずはサンプルコード

今回は下記のサンプルコードを例に、簡単なargparseの使い方を説明していこうと思います。
プログラムの内容としては、コマンドラインから引数を受け取り表示させるだけの
簡単な内容のものとなっています。

▼sample.py

# argparseをインポートする
import argparse

# 最初にパーサーとしてArgumentParserオブジェクトを作成する
psr  = argparse.ArgumentParser(
    prog='プログラムの名前',
    usage='プログラムの使い方',
    description='プログラムの説明'
    )

# add_argumentメソッドを使って、コマンドラインから引数を受け取る処理を作成する
psr.add_argument('-f', '--first', required=True, help='一つ目の引数')
psr.add_argument('-s', '--second', required=True, help='二つ目の引数')
psr.add_argument('-t', '--third', help='三つ目の引数(必須ではない)')

# 受け取った引数を解析する
args = psr.parse_args()

# 解析した引数を表示する
print('引数1:' + args.first)
print('引数2:' + args.second)
print('引数3:' + args.third)

サンプルコードの実行結果

プログラムの説明は後回しにして、とりあえずサンプルプログラムに
コマンドライン引数を渡して実行してみます。

python3 sample.py -f 東京 -s 大阪 -t Denet
----------------
引数1:東京
引数2:大阪
引数3:Denet
----------------

とりあえず引数がそのまま表示されるプログラムができました。

argparseの説明

それではサンプルコードを使ってargparseの使い方を説明していきます。

argparseのインポート

import argparse

argparseはデフォルトで用意されているモジュールなので
追加でインストールしなくても、そのままimportして利用できます。

ArgumentParserでパーサーの作成

psr  = argparse.ArgumentParser(
    prog='プログラムの名前',
    usage='プログラムの使い方',
    description='プログラムの説明'
    )

ArgumentParserでパーサーを作成することで、コマンドラインから引数を
受け取ることができるようになります。

ArgumentParserは、コマンドラインを解析してPython用のデータ型へと変換
するために必要な情報を持つオブジェクトになります。

またprogやusageやdescription等の引数を渡すことで
helpオプションを実行した時にプログラムの使い方や説明を表示させることができるようになります。

ちなみに上記コードに-h(--help)オプションをつけて実行した場合は下記の結果が表示されます。

python3 sample.py -h
----------------
usage: プログラムの使い方

プログラムの説明
----------------

add_argumentメソッドで引数をオブジェクトに渡す

psr.add_argument('-f', '--first', required=True, help='一つ目の引数')
psr.add_argument('-s', '--second', required=True, help='二つ目の引数')
psr.add_argument('-t', '--third', help='三つ目の引数(必須ではない)')

add_argumentメソッドを使って、コマンドラインから受け取った引数を
オブジェクトに渡すための処理を記述しています。

'-f', '--first' の部分はコマンドラインから引数を受け取る際のオプションを指定する箇所になります。
この場合だと実行時は sample.py -f 引数 または sample.py --first 引数 といった形で
引数を受け取ることができます。

required=True の部分はTrueにしておくことで、引数の入力を必須にできます。
この場合に引数を入力せず実行するとエラーが返されます。

逆にrequiredが未設定の場合は、引数の入力がなくても、エラーなく実行ができるようになっています。
またその場合は、default='デフォルト値' を用意しておくと、引数が未入力の場合は
デフォルトの値が利用するように設定することができます。

例として

# 引数必須
psr.add_argument('-f', '--first', required=True, help='一つ目の引数')
# 引数は必須ではない defalutが設定されてる
psr.add_argument('-s', '--second',default='デフォルト値', help='二つ目の引数')

この場合で、引数1だけ指定して実行すると...

python3 sample.py -f 引数
----------------
引数1:引数
引数2:デフォルト値
----------------

引数2の部分は何も渡さなかったので、デフォルト値が表示されました。

また '-f', '--first' の部分は他にも以下のように名前で指定方法があります。

# firstと名前のみを入力
psr.add_argument('first', help='一つ目の引数')
# secondと名前のみを入力
psr.add_argument('second', help='二つ目の引数')

この場合は、コマンドラインでオプションを使わずに引数を受け取ることが可能になります。
但し、requiredは強制的にTrueになり、また順番通りに引数を渡して実行する必要があります。

例として実行時は、 sample.py 引数1 引数2 といった形でオプションはつけずに
引数だけを順番通りにコマンドライン引数として渡していく形になります。

help='一つ目の引数' の部分はコマンドにhelpオプションをつけて実施した場合に
引数の説明を表示させる部分になります。

実際にサンプルコードに-h(--help)オプションをつけて実行すると...

python3 sample.py --help
----------------
usage: プログラムの使い方

プログラムの説明

optional arguments:
  -h, --help            show this help message and exit
  -f FIRST, --first FIRST
                        一つ目の引数
  -s SECOND, --second SECOND
                        二つ目の引数
  -t THIRD, --third THIRD
                        三つ目の引数(必須ではない)
----------------

このように引数の説明を表示させることができます。

parse_argsを使って受け取った引数を利用できる状態にする

args = psr.parse_args()

最後にparse_argsメソッドを実行することで、ArgumentParserで受け取った
引数の情報を実際に利用できる状態にできます。

コマンドラインから受け取った引数の取り出し

print('引数1:' + args.first)
print('引数2:' + args.second)
print('引数3:' + args.third)

今回は取り出した引数をprintで表示させるだけの処理にはなりますが
args.first, args.second, args.third といった形で
add_argumentで指定した名前を使って、引数を取り出すことができます。

add_argumentでオプションで指定した場合は、、ハイフンを2個つけた方の名前を使い
例として ' -f, --first' の場合は args.first で取り出し
名前で指定した場合は上記同様に args.first で取り出すことができます。

あとは取り出した引数を使って、何かしらの処理を組み込めば
オリジナルのPythonコマンドが作成できるようになります。

あとがき

argparseモジュールを使うことで、簡単にPythonでコマンドライン引数を使った
コマンドを作成することができました。

今回はargparseを使ったコマンドライン引数の受け取り方のみの説明しましたが
何かしら処理を実行するコマンドを作成する際の参考にしていただければと思います。

参考

参考:argparseリファレンス
参考:ArgumentParserの使い方を簡単にまとめた