学習をすすめる上で、実行時に適当な値を設定して確認したくなる場合が出てくるかもしれません。方法の1つとしてコマンドラインで指定した引数を取得するという方法が挙げられます。本稿にはモジュールや関数、if文等、未解説の用語が登場しますが、まずはコマンドライン引数を使用する場合にはこういう書き方をするのだ、という程度に理解し、必要に応じて復習してください。
Pythonのコマンドライン引数
コマンドライン引数の取得
Pythonスクリプトを実行する際にコマンドライン引数を指定する場合、標準ライブラリであるsysモジュールのargvを利用します。argvはスクリプトに渡されたコマンドライン引数が格納されたリストとなります。
0番目はスクリプトのファイル名が設定され、1番目以降にコマンドライン引数が設定されます。また、入力値は文字列型として扱われます。
では、サンプルで動作を確認してみましょう。
サンプルコード args.py
import sys args = sys.argv print(args)
args.pyという名前で保存して、引数なし、引数ありでそれぞれ動作を確認してみます。
実行結果
# 引数なし $ python args.py ['args.py'] # 引数:hoge $ python args.py hoge ['args.py', 'hoge'] # 引数: hoge foo $ python args.py hoge foo ['args.py', 'hoge', 'foo']
0番目にスクリプト名、それ以降にコマンドライン引数がセットされたリストであることが解ると思います。
このため、以下のように大カッコで番号を指定すると値を取得することが可能です。(リストの要素へのアクセス方法についてはこちらをご参照ください。)
sample.py
from sys import argv print(argv[0]) # スクリプトファイル名 print(argv[1]) # 1番目の引数 print(argv[2]) # 2番目の引数
実行結果
python sample.py hoge fuga sample.py hoge fuga
コマンドライン引数の数をチェックする
上のプログラムでは、引数が不足しているとlist index out of rangeというエラーが発生します。こういったエラーを回避するために処理前に引数をチェックするような処理を入れるには、以下のように、len関数で引数の数をチェック(※1, ※2)します。また、前述の通り、文字列として扱われますので、適宜数値チェック等を入れましょう。
サンプルコード
import sys def main(cod3, name): print('main処理を実行します') # 以下省略 if __name__ == '__main__': args = sys.argv if len(args) == 3: code = args[1] name = args[2] main(code, name) else: print('以下形式でcodeとnameを指定してください') print('$ sample.py <code> <name>') quit()
上のコードでは引数に過不足があると、main処理は実行されず、コードのパラメータ指定方法が出力されます。
※1 len関数は後のページで解説するリストなどのシーケンシャルな型の要素数を取得することができる、Pythonに予め組み込まれている組み込み関数の1つです。
※2 ifとは制御文の一種で、条件ごとに処理を振り分けることが可能となります。
補足 argparse
簡単な引数を使用する場合はこのページで紹介したargvで十分ですが、ある程度機能が増え任意オプションなどが必要となる場合はargparseを使用することをおすすめします。