Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

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

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

その②に続く。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away