Pythonスクリプトをコマンドラインやシェルスクリプト、あるいは他のプログラムから呼び出して実行する場合、「その処理が正常に終わったのか、それともエラーで終わったのか」を呼び出し元に伝える必要があります。
この伝達手段として使われるのが**「終了ステータス(終了コード)」**です。
通常、Pythonプログラムが最後まで到達すると終了ステータスは自動的に 0(正常終了)になりますが、エラー発生時などに意図的に 0 以外の数値(エラー)を返して終了させたい場合があります。これを行うのが sys.exit() 関数です。
この記事では、sys.exit() の使い方と、終了ステータスの活用方法について解説します。
終了ステータスの基本ルール
プログラミングの世界(特にUnix/Linux系)では、プロセスの終了状態を以下の整数で表す慣習があります。
0: 正常終了 (Success)。エラーなく完了したことを示します。1以上の整数: 異常終了 (Error)。何らかの問題が発生したことを示します(一般的には1が使われます)。
sys.exit() の基本的な使い方
sys.exit() を使用するには、標準ライブラリの sys モジュールをインポートする必要があります。引数に整数を渡すことで、その数値を終了ステータスとしてプログラムを直ちに終了させます。
具体的なコード例
例として、入力されたデータの整合性をチェックし、不正であればエラーコード 1 で終了するプログラムを作成します。
import sys
def main_process(user_id):
print(f"処理開始: ユーザーID {user_id} のチェックを行います。")
# ユーザーIDは正の整数でなければならないというルール
if user_id <= 0:
# エラーメッセージを標準エラー出力に出力(推奨)
print("エラー: ユーザーIDは1以上の整数である必要があります。", file=sys.stderr)
# 終了ステータス 1 (異常終了) でプログラムを停止
sys.exit(1)
print("チェック完了: 正常なデータです。")
print("メイン処理を実行します...")
# ... 何らかの処理 ...
print("処理完了。")
# 明示的に 0 で終了することも可能(省略時は自動的に 0 になる)
sys.exit(0)
# --- 実行 ---
# ケース1: 不正なデータを渡す
main_process(-5)
実行結果:
処理開始: ユーザーID -5 のチェックを行います。
エラー: ユーザーIDは1以上の整数である必要があります。
(ここでプログラムは停止し、以降の「メイン処理を実行します…」は表示されません。)
終了ステータスの確認方法
設定した終了ステータスは、Pythonスクリプトを実行した「シェル(ターミナル)」側で確認できます。
Linux / macOS (bash, zsh)
直前のコマンドの終了ステータスは特殊変数 $? に格納されます。
$ python script.py
$ echo $?
1
Windows (Command Prompt)
直前のコマンドの終了ステータスは環境変数 %ERRORLEVEL% に格納されます。
> python script.py
> echo %ERRORLEVEL%
1
この仕組みを利用することで、シェルスクリプトなどで「Pythonスクリプトが成功したら次の処理へ、失敗したら中断」といった制御が可能になります。
sys.exit() にメッセージを渡す
sys.exit() の引数には、整数の代わりに文字列を渡すこともできます。 文字列を渡した場合、以下の動作が行われます。
- その文字列を標準エラー出力(stderr)に表示する。
- 終了ステータスとして
1を返す。
これにより、エラーメッセージの表示と終了を1行で記述できます。
import sys
filename = "config.ini"
# ファイルが存在しないと仮定
if filename != "config.json":
# メッセージを表示して、ステータス 1 で終了
sys.exit(f"Fatal Error: 設定ファイル '{filename}' の形式が不正です。")
実行結果:
Fatal Error: 設定ファイル 'config.ini' の形式が不正です。
まとめ
- Pythonスクリプトを任意のステータスで終了させるには
sys.exit()を使用します。 sys.exit(0)は正常終了、sys.exit(1)は異常終了を意味します。sys.exit("メッセージ")とすると、エラーメッセージを表示しつつステータス1で終了できます。- この機能は、他のプログラムやシェルスクリプトと連携して自動化を行う際に非常に重要です。
