Python: sys.argvについて(追記あり)

Python

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でした。

コメント

タイトルとURLをコピーしました