LoginSignup
0
2

More than 5 years have passed since last update.

Pythonにコマンドライン引数を渡す① sys.argvと try-except

Last updated at Posted at 2018-11-29

ファイル操作やパラメータ操作を伴うプログラムでは都度エディタでマジックナンバを操作するのは割に合わないのでコマンドライン引数で渡したくなる。

コマンドライン引数を受け取る方法

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)

このsizesavefileをコマンドライン引数で与えたい。

基本的な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は遅いという話も聞くが,呼び出し時に一度だけなら使用しても良いと思うのだが(未検証)いかがだろうか。

その②に続く。

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2