コマンドライン引数
前回、Webカメラの画像を取得したり、動画を録画したりする方法を紹介しました。
今回はPythonをターミナルやコマンドプロンプトで実行する際、引数(コマンドライン引数)を受け取る方法を紹介します。
外部から引数を受け取れるようになると、わざわざJupyter notebookを開いて変数を変えて実行するという必要がなくなります。
またそれにより他の言語からコマンドラインを介してPythonに情報を渡すこともできるようになります。
ちなみに今回はPythonプログラムを書いてから、実行はターミナルやコマンドプロンプトで行いますので注意してください。
ターミナルの基本的な使い方はこちらの記事で解説していますので、よかったらどうぞ。
それでは始めていきましょう。
コマンドライン引数を取得
コマンドライン引数を受け取るには標準ライブラリであるsysモジュールを使い、「sys.argv」で受け取ります。
import sys
args = sys.argv
print(args[0])
print(args[1])
このプログラムをPythonの実行形式である「.py」で保存してください。
ちなみに常時「.ipynb」と「.py」で保存する設定はこちらの記事で紹介していますので、よかったらどうぞ。
そしてMacならターミナル、Windowsならコマンドプロンプトで、先ほどのPythonプログラムが保存されているフォルダまで移動し、こちらのコマンドを実行してみましょう。
python argument-1.py test
実行結果
argument-1.py
test
args[0]にはプログラム名が、args[1]に引数(test)が表示されました。
ここで注意する点はargs[0]はプログラム名であり、こちらは毎回存在することから、コマンドライン引数を取得する際にインデックスに注意することです。
次に引数を2つに増やしてみましょう。
Pythonプログラムでは2つ目のコマンドライン引数を表示するための「print(args[2])」を追加します。
import sys
args = sys.argv
print(args[0])
print(args[1])
print(args[2])
ターミナルで実行してみるとこんな感じになります。
python argument-1.py test1 test2
実行結果
argument-1.py
test1
test2
コマンドライン引数が足りない場合
よくあるミスとしては、プログラム中では複数のコマンドライン引数を取得しているのに、コマンドラインではそれよりも少ない数の引数を与えてしまうことです。
例えばこちらのPythonのプログラムでは2つのコマンドライン引数を使用しています。
import sys
args = sys.argv
print(args[0])
print(args[1])
print(args[2])
実行する際に1つだけコマンドライン引数を与えてみるとこうなります。
python argument-2.py test1
実行結果
argument-2.py
test1
Traceback (most recent call last):
File "/Users/suzukihironori/Desktop/Python/test/argument/argument-2.py", line 22, in <module>
print(args[2])
IndexError: list index out of range
2つ目のコマンドライン引数(args[2])は存在しないため、「list index out of range」のエラーが出ました。
ユーザーがどのように使うか、決められた数以外の引数を与えてしまう可能性も考え、エラーを出すようにしてみましょう。
決められた数以外の引数が与えられた場合にエラーを出す方法
決められた数以外の引数が与えられた場合にエラーを出すにはif文で条件分岐させます。
例えばコマンドライン引数の数が1より多く、3以下(つまり1つか2つ)の場合はこんな感じになります。
import sys
args = sys.argv
if 1 < len(args) <= 3:
for i in range(1, len(args)):
print(args[i])
elif len(args) == 1:
print('Error: one or two arguments are required.')
else:
print('Number of arguments are too many.')
「args = sys.argv」でコマンドライン引数を受け取った後、「if 1 < len(args) <= 3:」と「elif len(args) == 1:」と「else:」で条件分岐させています。
「1」を条件分岐させているのは、先ほどお話しした通り、必ずプログラム名が返ってくるためです。
こちらのプログラムを試してみましょう。
引数なし
python argument-3.py
実行結果
Error: one or two arguments are required.
引数1つ
python argument-3.py test1
実行結果
test1
引数2つ
python argument-3.py test1 test2
実行結果
test1
test2
引数3つ
python argument-3.py test1 test2 test3
実行結果
Number of arguments are too many.
正しくコマンドライン引数の数で条件分岐することができました。
デフォルト値を設定する方法
コマンドライン引数のデフォルト値を設定したい場合は、変数を用い、デフォルト値を設定しておき、コマンドライン引数が存在する場合は書き換えることで対応可能です。
例えばプログラムとしてはこんな感じ。
import sys
args = sys.argv
arg1 = 'a'
arg2 = 'b'
if len(args) == 2:
arg1 = args[1]
elif len(args) == 3:
arg1 = args[1]
arg2 = args[2]
print(args[0])
print(arg1)
print(arg2)
「arg1 = ‘a’」と「arg2 = ‘b’」でデフォルト値を設定し、その後、コマンドライン引数の数で条件分岐させ、対応するコマンドライン引数がある場合は書き換えています。
これを実行するとこうなります。
引数なし
python argument-4.py
実行結果
argument-4.py
a
b
引数1つ
python argument-4.py test1
実行結果
argument-4.py
test1
b
引数2つ
python argument-4.py test1 test2
実行結果
argument-4.py
test1
test2
値を書き換えることができました。
ただここまで行くと、sysモジュールを使うのではなく、同じく標準ライブラリの「argparse」を使う方が便利です。
ということで次回はargparseの使い方を見てみましょう。
ではでは今回はこんな感じで。
コメント