Pythonでコマンドライン引数を渡す方法
Pythonでコマンドライン引数を渡す方法をご紹介します。
目次
条件
- Python 3.7.0
sys.argvを用いる方法
sys.argvを用いる場合は非常に簡単です。
以下にサンプルプログラムを示します。
サンプルプログラム
# argvTest.py import sys print('=== コマンドライン引数 ===') args = sys.argv print('■引数リスト') print(args) print('■引数個別') print(args[0]) print(args[1]) print(args[2])
実行結果1
>python argvTest.py test1 test2 === コマンドライン引数 === ■引数リスト ['argvTest.py', 'test1', 'test2'] ■引数個別 argvTest.py test1 test2
実行プログラムの後にスペースを空けて文字列を渡せばOKです。
引数リストの1つ目が「実行ファイル名」になるところがポイントです。
実行結果2
>python argvTest.py test1 === コマンドライン引数 === ■引数リスト ['argvTest.py', 'test1'] ■引数個別 argvTest.py test1 Traceback (most recent call last): File "argvTest.py", line 13, in <module> print(args[2]) IndexError: list index out of range
渡す引数の数が、プログラム内でアクセスするリストサイズより小さいとエラーになります。
sys.argvを用いたコマンドライン引数取得は簡単ですが、引数取得後にプログラム内で各種エラー処理が必要になります。
argparseを用いる方法
argparseを用いることで、「プログラムhelpの表示」や「引数の各種チェック」などを行うことができます。
実運用で使用するプログラムは「argparse」を用いた実装を行う方が無難です。
以下にサンプルプログラムを示します。
以下のような処理を行うプログラムです。
- 何も引数を渡さない場合:デフォルトモードで動作
- 引数に日時(YYYY/MM/DD)を渡す場合:特定モードで動作
サンプルプログラム
# argparseTest.py import argparse from datetime import datetime as dt, timedelta ## コマンドライン引数を受け取る関数 def get_args(): parser = argparse.ArgumentParser( description='Set the target date if you want to regist specific date data.') parser.add_argument('--target', metavar='YYYY/MM/DD', type=str, help='Target date to regist specific date data.') args = parser.parse_args() return(args) ## main関数 def main(): args = get_args() # コマンドライン引数を取得 if getattr(args, 'target'): # 'target'に値が渡されているか確認 print('Processing specfic mode.') print('target args = ' + args.target) target_datetime = dt.strptime(args.target, '%Y/%m/%d') print(target_datetime) else: print('Processing default mode.') ## main関数を実行 if __name__ == '__main__': main()
実行結果(引数なし)
>argparseTest.py Processing default mode.
実行結果(引数あり)
>argparseTest.py --target 2018/12/14 Processing specific mode. target args = 2018/12/14 2018-12-14 00:00:00
実行結果(引数不足)
>argparseTest.py --target usage: argparseTest.py [-h] [--target YYYY/MM/DD] argparseTest.py: error: argument --target: expected one argument
実行結果(余計な引数あり)
>argparseTest.py --target 2018/12/14 aa usage: argparseTest.py [-h] [--target YYYY/MM/DD] argparseTest.py: error: unrecognized arguments: aa
実行結果(help表示)
>argparseTest.py -h usage: argparseTest.py [-h] [--target YYYY/MM/DD] Set the target date if you want to regist specific date data. optional arguments: -h, --help show this help message and exit --target YYYY/MM/DD Target date to regist specific date data.
>argparseTest.py --help usage: argparseTest.py [-h] [--target YYYY/MM/DD] Set the target date if you want to regist specific date data. optional arguments: -h, --help show this help message and exit --target YYYY/MM/DD Target date to regist specific date data.
プログラム作成に数行の手間はかかりますが、上記のように引数チェックやhelp表示も出来て便利です。
argparseは他にも様々な設定項目がありますので、詳細は公式ドキュメントをご参照ください。
参考
Python公式:システムパラメータと関数
https://docs.python.org/ja/3/library/sys.html#sys.argv
Python公式:argparse — コマンドラインオプション、引数、サブコマンドのパーサー
https://docs.python.org/ja/3/library/argparse.html#module-argparse