ここでは、sys.argv
でコマンドライン引数を参照する初歩的な方法を説明しますが、ある程度複雑なコマンドライン引数を扱いたいときは、Python の標準ライブラリの argparse モジュールを使う ことをおすすめします。
コマンドライン引数を参照する
Python スクリプト起動時にコマンドライン引数として渡された値は、sys.argv
で文字列リストの形で参照することができます。
先頭の要素 sys.argv[0]
には、python
コマンドで指定したスクリプト自身の名前が格納されています。
import sys
print(sys.argv)
print(len(sys.argv))
$ python sample.py aaa bbb ccc
['sample.py', 'aaa', 'bbb', 'ccc']
4
sys.argv
の先頭にスクリプト自身の名前が入っているので、len(sys.argv)
は少なくとも 1 以上の値になります。
コマンドライン引数が正しく指定されていないときに Usage 表示する
下記は、コマンドライン引数を 1 つも指定せずにスクリプトを実行した場合に使い方 (usage) を表示して終了するサンプルです。
import sys
import os
if len(sys.argv) < 2:
# コマンドライン引数が指定されなかった場合は終了
print(f"Usage: python {os.path.basename(sys.argv[0])} <name>")
sys.exit(1)
print(f"Hello, {sys.argv[1]}!")
$ python hello.py
Usage: python hello.py <name>
$ python hello.py Maku
Hello, Maku!
スクリプト名を除いてコマンドライン引数を取得する
sys.argv[0]
には自身のスクリプトファイル名が含まれています。
純粋にコマンドライン引数だけを取り出したい場合は、sys.argv[1:]
のようにインデックス 1 以降を取り出してしまうと分かりやすくなります。
コマンドライン引数がひとつも渡されなかった場合は、sys.argv[1:]
は空リストになります。
import sys
args = sys.argv[1:]
for x in args:
print(x)
$ python sample.py 100 200
100
200
(おまけ)ハッカー流のコマンドライン引数の処理方法
下記は、高校生ハッカーが主人公のドラマ『ブラッディ・マンデイ』の中で、主人公であるファルコンが使ってた方法です。
なんらかの攻撃ツールを即席で実装してたシーン。
強引に sys.argv
をスライスしてしまって、正しい数のパラメータを指定されていない場合に、ValueError
例外を発生させてしまうやり方です。
なるほどねー
import sys
try:
host, frm, to = sys.argv[1:4]
except ValueError:
print("Usage: %s <host> <from> <to>" % (sys.argv[0]))
sys.exit(1)