本記事ではPythonでコマンドライン引数を扱う方法を解説します。具体的には、コマンドライン引数のリストであるsys.argvの使い方を説明します。
sys.argvの基本的な使い方
Pythonのスクリプトにコマンドライン引数(プログラムを実行する際に指定する追加のデータ)を与えると、それらはsys.argvというリストに格納されます。リストの最初の要素には実行したスクリプト名が入り、その後ろの要素に引数として渡した文字列が順番に格納されます。(つまり、[script_name, arg_1, arg_2, …]のようなリストです。)
例えば、以下のようにスクリプトを実行したとします。
python sample.py apple banana
sys.argvの中身は以下のようになります。
- sys.argv[0] → 実行したスクリプトのファイル名(sample.py)
- sys.argv[1] → apple
- sys.argv[2] → banana
具体的なコード例は以下です。
import sys
print(sys.argv) # ["sample.py", "apple", "banana"]
print(sys.argv[0]) # "sample.py"
print(sys.argv[1]) # "apple"
print(sys.argv[2]) # "banana"
argsをループで扱う場合
複数の引数を順に処理したい場合、以下のようにループを使って引数を1つずつ取り出せます。ただし、インデックス0はスクリプト名なので、インデックス1から取り出しています。
import sys
for arg in sys.argv[1:]:
print("Argument:", arg)
注意点
sys.argv[0]にはスクリプト名が入る
コマンドライン引数として渡した値(appleやbananaなど)は、実際にはsys.argv[1]以降になります。引数を使うときはインデックスを間違えないように気をつけましょう。
スクリプト名がない場合
通常はpythonコマンドでスクリプトを実行するとsys.argv[0]にスクリプト名が入りますが、一部の特殊な環境や実行方法によってはsys.argv[0]が空文字になることがあります。スクリプトを実行する環境によって挙動が変わる可能性がある点に注意してください。
文字列として扱われる
コマンドライン引数はすべて文字列として受け取られます。数値として扱いたい場合はintなどで明示的に型変換(データの型を変えること)を行う必要があります。
例えば、次のように書くと引数を整数として扱えます。
import sys
num = int(sys.argv[1]) # 1つ目の引数を整数に変換
print(num * 2) # 2倍した値を表示
コマンドライン引数としてファイルを扱いたい場合
コマンドライン引数にファイル名を指定して、そのファイルの内容を順次読み込みたいときには、標準ライブラリのfileinputモジュールを使うのがおすすめです。fileinputモジュールを利用すると、以下のように書くだけでコマンドライン引数として渡されたファイルの中身を1行ずつ処理できます。
import fileinput
for line in fileinput.input():
print(line, end="")
この例では、python sample.py file1.txt file2.txtのようにファイル名を複数指定して実行した場合、それらをまとめて処理できます。複数のファイルを扱う時に特に便利なので、ファイル操作をする場合は検討してみましょう。
まとめ
- sys.argvは、Pythonのスクリプトがコマンドラインから受け取った引数をリストとして保持するための仕組み
- インデックス0はスクリプトファイル名、1以降はコマンドライン引数が順番に格納される
- 渡される引数は文字列として認識されるため、必要に応じて型変換が必要