この記事ではPythonでプログラム実行時に渡すコマンドライン引数を取り扱えるライブラリargparseについて紹介します。
sys.argv / argparseとは
argparseを使うと、Pythonのプログラム実行時により高度な引数の渡し方をする事ができます。似たようなライブラリにsys.argvもありますので、こちらも簡単に紹介ます。
次のプログラムの実行例を考えてみます。
python main.py 1 2 3
ここで、1 2 3の部分がコマンドライン引数と呼ばれるものです。これらの引数はプログラムの実行時にプログラムに渡されます。そして、これらの値にアクセスしたい場合にsys.argvやargparseを使います。
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 — コマンドラインオプション、引数、サブコマンドのパーサー
最新記事 by t-tetsuya (全て見る)
- 【GPyOpt】Python x ベイズ最適化の基本をマスターしよう - 2020年12月29日
- Python print関数の基本の使い方 - 2020年12月10日
- Python関数の書き方の基本 - 2020年12月1日
・argparseの使い所
について理解することができます。