【argparse】引数を自在に扱えるライブラリの使い方

 この記事ではPythonでプログラム実行時に渡すコマンドライン引数を取り扱えるライブラリargparseについて紹介します。

この記事を読むことであなたは
・sys.argv / argparseの基本的な使い方
・argparseの使い所
について理解することができます。

sys.argv / argparseとは

 argparseを使うと、Pythonのプログラム実行時により高度な引数の渡し方をする事ができます。似たようなライブラリにsys.argvもありますので、こちらも簡単に紹介ます。

次のプログラムの実行例を考えてみます。

python main.py 1 2 3

ここで、1 2 3の部分がコマンドライン引数と呼ばれるものです。これらの引数はプログラムの実行時にプログラムに渡されます。そして、これらの値にアクセスしたい場合にsys.argvargparseを使います。

sys.argvの使い方

 sys.argvの場合、コマンドライン引数はリストとしてmain.py内に渡されます。main.pyの中でコマンドライン引数にアクセスする方法は次の通りです。

import sys

print("argv : ", sys.argv)

結果は次のようになります。

('argv : ', ['main.py', '1', '2', '3'])

 結果を見るとわかりますが、リストの最初の要素にプログラムの名前が入っている事が分かります。その次から、コマンドライン引数に渡した、1, 2, 3の要素が文字列として渡されている事が分かりますね。この為、本来の意図である数字の1, 2, 3として取り扱いたいのであれば、int()float()型変換してあげる必要があります。

argparseの使い方

 次にargparseの例を見てましょう。先ほどのsys.argvでは引数はリストで受け取られ、型は全て文字列で指定されていました。argparseの場合、もう少し細かい設定をする事が可能です。プログラムの例を紹介します。

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("arg1", help="Required Argument1")
parser.add_argument("--option_arg1", type=int, default=1000, help="Option Argument1")
parser.add_argument("--option_arg2", type=float, default=1.0, help="Option Argument1")
parser.add_argument("--option_arg3", type=str, default="sample", help="Option Argument1")


opt = parser.parse_args()
print(opt)

print("arg1 :", opt.arg1)
print("option arg1 :", opt.option_arg1)

 まず、import argparseでライブラリを読み込み、argparse.ArgumentParser()を作成します。この中に、.add_argument()を使って、引数を設定していく感じです。.add_argument()の使い方は次の通りです。

parser.add_argument("引数の名前", help="説明")

この際に、変数名の前に“-“(ダッシュ)を2個付けるとオプション引数になります。typeでは引数の型を設定します。また、defaultに値を入れることでデフォルト値を設定できます。help引数の説明です。このように、sys.argvよりも細かい設定が出来るので非常に便利です。設定ができたら、parser.parse_args()でoptの中にNamespaceオブジェクトを保存します。printすると引数と値のセットが返ってきます。

このプログラムを例えば、次のように実行します。

python sample_argparse.py 1

 すると、結果は次のように返ってきます。

Namespace(arg1='1', option_arg1=1000, option_arg2=1.0, option_arg3='sample')
arg1 : 1
option arg1 : 1000

argparseの実際

 argparseですが、どんな風に使う事が多いかと言うと機械学習のハイパーパラメータや学習のパラメーターを設定する時に使うと便利です。実際の例を次に示します。

parser = argparse.ArgumentParser()
parser.add_argument("--n_epochs", type=int, default=1000, help="number of epochs of training")
parser.add_argument("--batch_size", type=int, default=20, help="size of batches")
parser.add_argument("--data_size", type=int, default=3000, help="manual setting for custom data set")
parser.add_argument("--lr", type=float, default=0.001, help="learning rate")
parser.add_argument("--b1", type=float, default=0.5, help="hyper parameter of adam")
parser.add_argument("--b2", type=float, default=0.999, help="hyper parameter of adam")
parser.add_argument("--slope", type=float, default=0.2, help="slope for Leaky ReLU")
parser.add_argument("--n_cpu", type=int, default=8, help="number of cpu for batch generation")
parser.add_argument("--nx", type=int, default=256, help="number of x components")
parser.add_argument("--ny", type=int, default=128, help="number of y components")
parser.add_argument("--in_channels", type=int, default=2, help="number of in channels")
parser.add_argument("--out_channels", type=int, default=2, help="number of out channels")
parser.add_argument("--z_num", type=int, default=16, help="latent space dimension")
parser.add_argument("--seq_length", type=int, default=3, help="sequence data length")
parser.add_argument("--num_layers", type=int, default=4, help="num layers of encoder and decoder")
parser.add_argument("--act1", type=str, default="lrelu", help="activation function of AE")
parser.add_argument("--act2", type=str, default="elu", help="activation function of NN")
parser.add_argument("--h1", type=int, default=512, help="hidden size of MLP")
parser.add_argument("--h2", type=int, default=1024, help="hidden size of MLP")
parser.add_argument("--off_set", type=int, default=10, help="offset for target sequence data")
parser.add_argument("--gamma", type=float, default=0.75, help="hyper parameters for BE-GAN")
parser.add_argument("--lambda_k", type=float, default=0.001, help="hyper parameters for BE-GAN")
parser.add_argument("--k", type=float, default=0.0, help="hyper parameters for BE-GAN")
... (中略)
parser.add_argument("--divergence_loss", help="add divergence loss", action="store_true")
parser.add_argument("--train_type", default="LatentSpacePhysics", help="choose which model to train")
parser.add_argument("--lambda_cycle", type=float, default=10, help="hyper parameters for gradient loss")
parser.add_argument("--lambda_identity", type=float, default=0.1, help="hyper parameters for divergence loss")
parser.add_argument("--lambda_mse", type=float, default=0.1, help="hyper parameters for mse loss")
parser.add_argument("--fig_output", type=int, default=50, help="timing of figure output")
opt = parser.parse_args()
print(opt)

 こんな感じでズラーっとプログラムの冒頭に纏めておくと、ここを書き換えればepoch数やモデルの切り替えなどを簡単に管理できるわけですね。

関連のリンク

argparse — コマンドラインオプション、引数、サブコマンドのパーサー

The following two tabs change content below.
メーカーR&D職 研究開発業務にPythonを使用。 Udemy講師およびKindleで電子書籍を出版。 Udemyでは受講生 約15,000名 Pythonの適用範囲: データ分析、画像処理、統計解析、並列計算、流体解析、深層学習