この記事では、Pythonのコマンドライン引数について解説します。
コマンドライン引数とは、プログラム実行時に引き渡される値です。以下のようにPythonプログラムを実行した場合、「value1」と「value2」がコマンドライン引数です。
$ python main.py value1 value2
コマンドライン引数を使うことでプログラム実行時のオプションなどを指定できます。
それでは、コマンドライン引数の使い方を見ていきましょう!
sys.argvでコマンドライン引数を参照する
コマンドライン引数は、sys
モジュールのargv
リストから参照することができます。sys
モジュールは、標準ライブラリなのでインポートするだけで使用可能です。
import sys
sys.argv
sys.argv
には、以下のように値が格納されています。
argv[0] | スクリプト名。フルパス名かどうかはOSによって異なる。 |
---|---|
argv[1]以降 | コマンドライン引数 |
サンプル
実際にコマンドライン引数を受け取ってみましょう!
main.py
import sys
# 受け取ったコマンドライン引数をargs変数に代入
args = sys.argv
# スクリプト名
print(args[0])
# 第1引数
print(args[1])
# 第2引数
print(args[2])
では、このコードをターミナルから実行してみます。実行時に「aaa」と「bbb」という値を渡しています。
ターミナルやコマンドプロンプトから実行
$ python3 main.py aaa bbb
main.py
aaa
bbb
コマンドライン引数で受け取った値を出力することができました。
argparseでコマンドライン引数を参照する
argparse
モジュールを使うことで少ないコードで強力にコマンドライン引数を取り扱うことができます。argparse
モジュールは、Python 3.2で追加された標準ライブラリです。
argparse
モジュールは、以下の手順で使用します。
-
STEP1argparseのインポート
argparse
モジュールを使用するために、まずはインポートします。import argparse
-
STEP2パーサーの生成
パーサーを生成します。
# パーサー作成 parser = argparse.ArgumentParser()
ちなみにパーサーとは、なにかしらのルールに則って書かれた文字データを解析してプログラムで使えるように変換するプログラムのことを言います。
-
STEP3コマンドライン引数を追加する
受け取るコマンドライン引数の情報を追加します。ここで設定された情報はコマンドライン引数を解析する際に使われます。
# コマンドライン引数の追加 parser.add_argument()
-
STEP4コマンドライン引数を解析する
ステップ3で渡された情報を元に、コマンドライン引数を解析します。
# コマンドライン引数を解析 parser.parse_args()
それでは、実際にコマンドライン引数を取得してみましょう!
main.py
import argparse
# パーサー
parser = argparse.ArgumentParser()
# コマンドライン引数追加('arg1'=名前, type=変換する型, help=簡潔な説明)
parser.add_argument('arg1', type=int, help='整数値')
# コマンドライン引数追加(typeは省略されるとstrとなる)
parser.add_argument('arg2', help='文字列')
# コマンドライン引数を解析
args = parser.parse_args()
# 出力
print(f'arg1 = {args.arg1}, 型: {type(args.arg1)}')
print(f'arg2 = {args.arg2}, 型: {type(args.arg2)}')
ターミナルで実行
$ python main.py 123 arg2
arg1 = 123, 型: <class 'int'>
arg2 = arg2, 型: <class 'str'>
ヘルプの表示
コマンドライン引数を解析するプログラムはコマンドラインにヘルプを表示することができます。ヘルプを表示するにはプログラム実行時に--help
、または-h
オプションを指定します。
試しに、先ほどのコードのヘルプを表示してみます。
コマンドラインで実行
$ python main.py -h
usage: main.py [-h] arg1 arg2
positional arguments:
arg1 整数値
arg2 文字列
optional arguments:
-h, --help show this help message and exit
オプショナル引数
add_argument()
メソッドでコマンドライン引数の名前を指定する際に--名前
と指定することでオプショナル引数を指定できます。
main.py
import argparse
# パーサー
parser = argparse.ArgumentParser()
# オプショナル引数
parser.add_argument('-a1', '--arg1', type=int)
parser.add_argument('-a2', '--arg2')
# コマンドライン引数を解析
args = parser.parse_args()
# 出力(--の方の名前を使う)
print(f'arg1 = {args.arg1}')
print(f'arg2 = {args.arg2}')
# 辞書として扱いたい場合
print(vars(args))
コマンドラインで実行
$ python main.py -a1 123 -a2 a2
arg1 = 123
arg2 = a2
{'arg1': 123, 'arg2': 'a2'}
getoptでコマンドライン引数を参照する
getopt
モジュールは、C言語のgetopt()
関数のように扱えるコマンドラインオプションのパーサです。C言語を使っている方のためのモジュールとなります。
あえてargparse
ではなくgetopt
を使う必要もありませんが、既存のモジュールなんかではよく使われているので覚えておくと便利です。
getopt
モジュールは、getopt.getopt()
関数を使ってコマンドライン引数を解析します。
import getopt
getopt.getopt(args, shortopts, longopts=[])
args
args
引数には、解析する引数のリストを渡します。
基本的に sys.argv[1:]
が指定されます。
shortopts
認識させたいオプション文字を1つの文字列で指定します。値を受け取るオプション文字には、末尾に:
を付けます。
例えば、-a
, -b
, -c
のオプションが用意されており、-b
で値を受け取る場合のshortopts
は以下のようになります。
'b:ac'
longopts
認識させたいオプションの名前を文字列で指定します。値を受け取るオプションには、名前の最後に=
を付けます。
['aaa', 'bbb=', 'ccc']
返り値
返り値は、解析されたオプション文字と値のタプル(option, value)
を格納したリストとオプションの後ろに記述されたコマンドライン引数のリストを持ったタプルが返されます。
([(option, value)...], [コマンドライン引数...])
では、簡単なサンプルコードを見てみましょう!
import getopt
import sys
args = sys.argv[1:]
opts, args = getopt.getopt(args, 'b:ac',
['aaa', 'bbb=', 'ccc'])
print(f'opts: {opts}')
print(f'args: {args}')
実行結果
% python3 main.py -a -b 123 -c arg1 arg2
opts: [('-a', ''), ('-b', '123'), ('-c', '')]
args: ['arg1', 'arg2']
実際には以下のような感じで使います。
import sys
def main(args=None):
if args is None:
args = sys.argv[1:]
import getopt
# 例外処理
try:
opts, args = getopt.getopt(args, 'b:ac',
['aaa', 'bbb=', 'ccc'])
except getopt.error as err:
print(err)
return 2
# for文で処理
for o, a in opts:
if o in ("-a", "--aaa"):
print(f'-a, --aaa: {a}')
if o in ("-b", "--bbb"):
print(f'-b, --bbb: {a}')
if o in ("-c", "--ccc"):
print(f'-c, --ccc: {a}')
# 何かしらの処理を記述
return None
if __name__ == "__main__":
sys.exit(main())
実行結果
% python3 main.py -a -b 100 -c
-a, --aaa:
-b, --bbb: 100
-c, --ccc:
まとめ
この記事では、Pythonのコマンドライン引数を使う方法を解説しました。
sys.argv
を使えば簡単に取得でき、もっとしっかり使いたい場合は、argparse
モジュールを使用することでかなり色々なことができます。
それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ