sysモジュールのargvについての備忘録
sys.argvはPythonスクリプトに渡されたコマンドライン引数のリスト。
argv[0]はそのファイル名になるが、OSによってフルパスになるかどうかが変わってくるとの事。私の環境ではファイル名のみ。
ファイル実行時のPythonスクリプトに引数を与える事でリストに追加できる。
import sys print(sys.argv) print('The file I\'m running now is "' + sys.argv[0] + '"')
をarg1.pyとして実行すると、
% python3 arg1.py ['arg1.py'] The file I'm running now is "arg1.py"
となります。
sys.argv[0]であるファイル名”arg1.py”がリストに入っており、同様にこのファイル名を含んだ文章が出力されています。
次は引数を与えてみる。
import sys print(sys.argv) # print('The file I\'m running now is "' + sys.argv[0] + '"') print("Hello " + sys.argv[1])
ファイル名出力のラインをコメントアウトして、代わりにsys.argv[1]を使うコードを入力。
% python3 arg1.py Rock ['arg1.py', 'Rock'] Hello Rock
sys.argvのリストにarg1.pyの後につけた引数’Rock’が追加され、そのsys.argv[1]を含んだ文を出力した事が分かる。
数字を入れて計算も出来るだろうか。
import sys print(sys.argv) # print('The file I\'m running now is "' + sys.argv[0] + '"') # print("Hello " + sys.argv[1]) print(sys.argv[1] + sys.argv[2])
リストのインデックス1とインデックス2を足すコードを追加。
% python3 arg1.py 52 79 ['arg1.py', '52', '79'] 5279
あれ?52と79が繋がっただけ。そう、sys.argvで作られるリストにおいて、各項目はstr型で保存されるので、数字に変換する必要がある。
import sys print(sys.argv) # print('The file I\'m running now is "' + sys.argv[0] + '"') # print("Hello " + sys.argv[1]) print(int(sys.argv[1]) + int(sys.argv[2]))
% python3 arg1.py 52 79 ['arg1.py', '52', '79'] 131
これで数字として認識され、計算ができます。
この数字に限りませんが、引数を複数入れる場合、引数同士の間はスペースで。
下手にカンマなど使用するとカンマまで含んだ引数と見なされ、エラーになります。
% python3 arg1.py 52, 79 ['arg1.py', '52,', '79'] Traceback (most recent call last): File "/Users/〜〜〜〜/arg1.py", line 5, in <module> print(int(sys.argv[1]) + int(sys.argv[2])) ValueError: invalid literal for int() with base 10: '52,'
ちなみに、pythonのインタラクティブ(対話)モードの場合、sys.argvはただの空リストになる。
>>> import sys >>> sys.argv [''] >>> sys.argv[0] ''
因みに、今まで書いてきて分かるが、引数の内どれを使うのか、また引数の個数とlist”sys.argv”のindexの辻褄、例えばindexは2(3つめ)を指定しているのに引数を1つしか入力しなかった場合に”index out of range”エラーが出る等の対処は常にfileのコートを直接調整する事が必要。(10/9 追記)
と言う事で、インタラクティブモードでPythonを実行する時以外は使わないので、すぐ忘れがちなsys.argvでした。
コメント