pythonのプログラム終了に使われる sys.exit( ) と os._exit( )は、似ているようで実は本質的に別の動作をします。ここではその違いを整理してまとめてみます。
sys.exit( )
通常の方法によるプログラムの終了です。
- 実行中の関数から
SystemExit
例外を送出し、それを捕捉できます。 try...finally
やatexit
登録関数などは実行されます。- 引数には
int
だけでなく文字列やオブジェクトも渡すことができます(文字列を渡すと標準エラー出力に表示されます)。
Python
import sys
try:
sys.exit("終了します")
finally:
print("これは実行される。クリーンアップに使える")
os._exit( )
プロセスを強制的に終了させます。特に fork() した子プロセスなどで使われます。
- 終了時に クリーンアップ処理を一切行わない(例:
finally
ブロック、atexit
登録関数、バッファのフラッシュなどはスキップ)。 - 終了ステータスを
os._exit(n)
で指定(整数)。 - C言語の
exit()
よりも_exit()
に近いローレベルな挙動。
Python
import os
pid = os.fork() # 子プロセスをfork
if pid == 0: # 子プロセスで実行
print("子プロセス終了")
os._exit(0)
else: # (親プロセス側)子プロセスの終了を待機
os.wait()
os.fork()
の呼び出しによって、現在のプロセスが「親プロセス」と「子プロセス」の2つに分岐します。そして、if pid == 0:
以降のコードは 子プロセス側でのみ実行され、else:
側は 親プロセス側でのみ実行されます。
このコード例で、os._exit(0)は子プロセス側で実行され、それ(子プロセス)を終了します。else:側は親プロセスで実行され子プロセスの終了を待ちます。
atexit
Python
import atexit
def goodbye():
print("プログラムを終了します。後始末完了。")
atexit.register(goodbye)
print("メインの処理中…")
# メインの処理中…
# プログラムを終了します。後始末完了。
atexit は、Python プログラムの終了時に実行したい関数を登録するための標準モジュールです。例えば、リソースの解放、ログの出力、終了メッセージの表示などを、明示的に書かなくても「最後にまとめて実行するリスト」に入れておける仕組みです。
コメント