頭がいい人のPythonのexitの使い方

431, 2022-03-17

目次

頭がいい人のPythonのexitの使い方

Pythonのexit関数を使うと好きなところでプログラムを終了させることができます。
exit関数の終了ステータスには正常終了異常終了があり、これらの終了ステータスは親プロセスに返されます。

この記事ではPythonのexit関数のすべてをお伝えします。
また、頭がいい人はexit関数をどのように使うのかも解説します。
exit関数を使いこなせるようになるとPythonによるプログラミングも捗るでしょう。

関連記事

exit関数の使い方

exit関数を使うにはsysモジュールをインポートする必要があります。

import sys

sysモジュールにドットを繋げてexit()を呼び出すとexit関数を使うことができます。

import sys

sys.exit()

sys.exit()を呼び出すと、そこからSystemExit例外が送出されます。
この例外はPythonにはトレースされません。
そのため一見するとプログラムがsys.exit()関数を呼び出した時点で終了してるように見えます。

sys.exit()は引数を省略したときは正常終了の終了ステータスを親プロセスに返します。
これは整数で言うと「0」になります。

Bashなどの端末で、↑のプログラムをsample.pyなどで保存して実行しますと、終了ステータスは0になっているのが確認できます。

$ python sample.py
$ echo $?
0

Bashで直前に実行したプログラムの終了ステータスを確認するには$?を参照します。
Windows環境のコマンドプロンプトなどでは%ERRORLEVEL%を参照すると終了ステータスを確認できます。

> python sample.py
> echo %ERRORLEVEL%
0

exitが本当に終了しているか確認する

↓のコードを書いて実行するとプログラムがexit関数で終了していることを確認できます。

import sys

print('Hello')
sys.exit()
print('World')

↑のプログラムをsample.pyなどに保存して実行すると↓のような結果になります。

$ python sample.py
Hello

print('World')が実行されずにprint('Hello')だけが実行されています。
Helloが出力された直後にsys.exit()でプログラムを終了しているので、Worldは出力されません。

終了ステータス(正常終了、異常終了)

sys.exit()の引数には整数を渡すことができます。
この整数が終了ステータスになります。

正常終了の場合は0, 異常終了の場合は0以外を渡します。

正常終了は、そのプログラムが正常に終了した場合に指定します。
いっぽう異常終了はプログラムが異常に終了した場合、つまりエラーなどが起こった場合などに指定します。

import sys

sys.exit(0)  # 正常終了
sys.exit(1)  # 異常終了

たとえば異常終了で整数1を指定した場合、Bashやコマンドプロンプトで確認できる終了ステータスも1になります。

終了ステータスは親プロセスが、実行した子プロセスがどのように終了したのかを知るための値です。
たとえばBashなどの端末では終了ステータスを使ってスクリプト内の処理を分岐させることができます。

python sample.py
if [ $? -eq 1 ]; then
  echo スクリプトの実行に失敗しました。
fi

↑のBashスクリプトはsample.pyを実行し、その終了ステータス($?)をif文で確認しています。
sample.pyが異常終了したら「スクリプトの実行に失敗しました。」と出力されます。

終了ステータスの小話

ちなみにC言語などでは終了ステータスは定数として定義されています。
EXIT_SUCCESSが正常終了で、EXIT_FAILUREが異常終了です。
これらの定数はstdio.hをインクルードすると使うことができます。

SystemExitを補足する

sys.exit()は例外SystemExitを送出する関数です。
これは例外なので補足することができます。

import sys

try:
    sys.exit(0)
except SystemExit as e:
    print(e)

↑のコードを実行すると

0

と出力されます。
このようにSystemExitを補足すれば、発生した終了処理をキャンセルすることもできます。

頭がいい人はexit関数をどのように使うか?

頭がいい開発者はsys.exit()をよく使います。
一体どんな時に使うのでしょうか?

これはたとえばこういう時です。

  • プログラムの使い方を表示する時

コマンド系のプログラムは-h--helpオプションなどでプログラムの使い方を表示することがよくあります。
これはUsage(使い方)と言われますが、こういった出力ではsys.exit()を使って使い方を表示した後にすぐにプログラムを終了したほうが、プログラムがシンプルになります。

たとえば↓のプログラムを見てください。

import sys


class App:
    def __init__(self):
        self.is_help = True

    def run(self):
        if self.is_help:
            self.usage()

        print('ここに色々なメイン処理')
        return 0

    def usage(self):
        print('Usage: program.py [options]')
        sys.exit(0)


if __name__ == '__main__':
    app = App()
    result = app.run()
    sys.exit(result)

↑は疑似的なプログラムです。
is_helpTrueのときに使い方を表示してプログラムを終了します。

一般に使い方の表示はプログラムの最初の方で行われます。
そのためsys.exit()で即座にプログラムを終了させても問題にならないことが多いです。

usage()を呼び出す前にプログラムのリソースなどを読み込んでいて、それらを後始末する必要がある場合は、この手は使えないので注意が必要です。

おわりに

今回はPythonのexit関数を解説しました。
頭のいい人はsys.exit()のメリット・デメリットを踏まえて、sys.exit()を便利に使います。
ぜひ見習いたいところですね。

(^ _ ^)

複雑なプログラムからexit

(・ v ・)

SystemExit



この記事のアンケートを送信する