ファイル操作やパラメータ操作を伴うプログラムでは都度エディタでマジックナンバを操作するのは割に合わないのでコマンドライン引数で渡したくなる。
コマンドライン引数を受け取る方法
Pythonでコマンドライン引数を入れる方法には
- sys.argv を用いる手法
- argparse を用いる手法
- docopt を用いる手法 (参考サイト)
等があるが,学習コストを考えるとsys.argvを用いるのが最も簡単だろう。
個人的にはdocoptの扱いに慣れておきたいが,自分で簡単に作るときは長らくsys.argvを使うと思う。
sys.argvを用いた手法
例えば,ファイル名を開いてそこに任意の大きさのnumpy行列をtxt形式で保存する関数を考える。
# named as test.py
import numpy as np
if __name__=='__main__':
savefile = 'hoge.txt'
size = 5
## create random array
array = np.random.rand(size,size)
np.savetxt(savefile,array)
このsize
とsavefile
をコマンドライン引数で与えたい。
基本的なsys.argvの使い方
コマンドラインで
test.py hoge.txt 5
と入力したとすると,
sys.argv
には['test.py','hoge.txt','5']
のようにリストが入る。
従って,sys.argv[i]
を用いて各引数にアクセスすることができる。
tyr-exceptでデフォルト引数を実現
よく使う入力を省略したり,何も考えずともとりあえず動くようにするにはデフォルト引数を設定したくなる。
以前はlen(sys.argv)
を用いてif文で分岐させていたが,最近はtry-exceptも悪くはないのではと思っている。
# named as test.py
import numpy as np
import sys
if __name__=='__main__':
try:
savefile = sys.argv[1]
except:
savefile = 'hoge.txt'
try:
size = sys.argv[2]
except:
size = 5
## create random array
array = np.random.rand(size,size)
np.savetxt(savefile,array)
引数が足りなかったり存在しない場合はexceptに飛ぶのでif分岐と同様の動作を期待できる上,条件分岐を書かずに済む点で若干楽だと思っている。
try-exceptは遅いという話も聞くが,呼び出し時に一度だけなら使用しても良いと思うのだが(未検証)いかがだろうか。
その②に続く。