コマンドラインには、引数を書くことができます。 例えば、echo.pyというPythonプログラムは引数をそのまま出力します。
> py echo.py abc abc
このとき、echo.pyの中では、どのようにして引数を得ているのでしょうか?
sysモジュール
引数を知るためには、sysモジュールを使います。 モジュールとは、Pythonの再利用可能なプログラムです。 sysは、はじめから組み込まれているモジュールです。
モジュールを使うときには、importコマンドを使います。
import sys
このコマンドは通常プログラムの最初に記述します。
sysは、引数をargvというリストにします。 このリストにアクセスするときは、sys.argvのように「モジュール名.リスト名」の形を用います。
import sys print(sys.argv[1])
これが、echoのプログラムです。 sys.arg[1]は1番目の引数を表します。
- コマンドラインでは、空白で引数を区切る
- 引数に空白を入れたいときはシングルクォートまたはダブルクォートで囲む
次の例を見てください。
> py echo.py abc def abc > py echo.py 'abc def' abc def > py echo.py "abc def" abc def
echo.py は1番目の引数を表示するので、最初の例ではabcのみが出力され、2番目の引数defは現れません。 残りの例ではクォートで囲んだ部分がまとまって1番目の引数になるのでabc defが表示されます。
なおsys.argv[0]は、プログラム名(例えばecho.py)を表します。
型変換
2つの引数が数字で与えられており、プログラムaddはその和を表示します。
> py add.py 10 15 25.0
引数の和を求めるには
sys.arg[1]+sys.arg[2]
で良さそうですが、うまく動きません。 なぜなら、引数は文字列であり、int型やfloat型ではないからです。 文字列から、intまたはfloatへの変換が必要で、そのための関数はint()やfloat()です。 ここでは、float型に直して計算することにしましょう。
import sys print(float(sys.argv[1])+float(sys.argv[2]))
print文の引数(かっこの中の部分)は複雑ですが、sys.arg[]で取り出した文字列をfloat()関数に渡してfloat型にしています。
エラーと例外処理
ここは、少し難しい話になりますが、プログラミングでは有益な内容です。 先ほどの関数int()やfloat()は引数が変換可能な数字でないとエラーになります。
- int("2.5") =>文字列2.5は整数にならないのでエラー
- float("Hello") =>文字列Helloは数字でないのでエラー
add.pyにおいてユーザが数字変換できない文字列を入力した場合、正しい使い方を表示するのが一般的に用いられる方法です。
また、引数が2つ(以上)なければエラーが起きます。 その場合も正しい使い方の表示をするのが良いでしょう。 例えば次のような表示です。
Usage: py add.py <number> <number>
プログラム実行時にエラーが起きた時に、例外処理として対処するのが有効な方法です。 エラー(error)と例外(exception)は異なる概念なのですが、ここでは詳しい説明は省きます。 先ほどのプログラムで、引数に10とHelloを与えたとします。 プログラムは1行目から順次実行し、次の箇所でエラーが起きます。
print(float(sys.argv[1])+float(sys.argv[2]))
2番目の引数Helloを文字列として取り出すところまではOKで、それをfloatに変換するところでエラーになります。 このエラーは例外を発生させプログラムはストップします。
このように、実行時のエラーは例外を発生させるので、その例外をキャッチしてコントロールできれば、様々なエラー対応が可能です。 これを例外処理といいます。
例外処理は2つの部分の組み合わせになります。 まず、例外が発生する可能性のある部分をtry文で表し、例外が発生した場合に実行するプログラムをexcept文で表します。 具体的には、add.pyを次のように修正します。
import sys try: print(float(sys.argv[1])+float(sys.argv[2])) except: print("Usage: py add.py <number> <number>")
try文のスイート(Pythonの文法では、一連の文のかたまりをスイートといいます。C言語の複文Compound statementに相当します)で例外が発生するとexcept節が実行され、その後try文の次に実行が移ります。 上のプログラムではtry文の次はない(excep節は除いて考えます)ので、プログラムは終了します。
例外処理では、もっと複雑なことができるのですが、ここでは最も簡単な例のみに止めておきます。