【Python基礎】sysモジュールを使ってコマンドライン引数を取得する方法

  • URLをコピーしました!
目次

コマンドライン引数

前回、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の使い方を見てみましょう。

ではでは今回はこんな感じで。

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次