[Python]exit関数について解説|3種類のexit関数を理解して使いこなそう
- システム
エンジニア - Pythonのexit関数について教えていただけますか。
- プロジェクト
マネージャー - Pythonのexit関数は3種類あって内部動作が異なります。Pythonのexit関数について解説いたしましょう。
Pythonのexitとは?
Pythonのexitにはいくつか種類がありますが、インタラクティブシェルやプロセスを終了させるための関数のことです。exit関数は終了コードを返すことができますので、コマンドプロンプトなどのコマンドシェルで終了コードを受け取ることができます。
以下に示すコマンドやプログラムは基本的にWindows10とPython3.9.1で動作確認していますが、一部Windowsでは動作しないものがありましたので、Linux(Ubuntu20.10)とPython3.9.1で動作確認しています。
Pythonのexit関数の種類
Pythonのexit関数は3種類あります。exit関数、sys.exit関数、os._exit関数です。みんなそれぞれ同じような関数なのですが、内部処理が異なりますので状況により適切なものを利用するようにしてください。
exit関数
exit関数はインタラクティブシェルを終了させるのに用います。
Pythonにはインタラクティブシェル(対話型シェル)という機能があります。インタラクティブシェルでは、Pythonとお話するような感覚でプログラムを実行できます。インタラクティブシェルを起動するにはコマンドプロンプトを起動して、Python、またはpyコマンドを実行します。
インタラクティブシェルで、単にexitと入力すると使い方のメッセージが表示されます。exit()[Enter]と入力するとインタラクティブシェルを終了します。
ちなみにexit関数をプログラム中で実行するとSystemExit例外が発生します。
下記はインタラクティブシェルでexit関数を実行したときの様子です。
1
2
3
4
5
|
>>> exit
Use exit() or Ctrl-Z plus Return to exit
>>> exit()
(インタラクティブシェル終了)
|
sys.exit関数
sys.exit関数はメインプロセスを終了します。サブプロセス(子プロセス)を作成した場合は、それを終了しませんのでご注意ください。
sys.exit関数は上の項のexit関数と挙動は同じです。下記のプログラムのsys.exit関数とexit関数のコメントを入れ替えてみて実行してみてください。どちらも「SystemExit」と表示されますので、SystemExit例外が発生しているのが分かります。
なお、sys.exit関数(exit関数も同様)の引数に数値(整数)を返すと終了コードになり、環境変数ERRORLEVELに設定されます。また、文字列で返すと終了コードは1になります。通常、終了コードは0が正常終了で、1(0以外)が異常終了になります。
1
2
3
4
5
6
7
8
9
10
|
import sys
try: # 例外が発生する可能性があるコードを記述します
sys.exit(“sys.exitです”)
# exit(“exitです”)
except SystemExit: # SystemExit例外
print(“SystemExit”)
finally:
pass
|
os._exit関数
os._exit関数はos.fork関数によって作られた新しいプロセス(子プロセス)を終了させるための関数です。os._exit関数は子プロセス側で呼び出して実行します。親プロセス側を終了する場合は普通にsys.exit関数を呼び出して終了してください。
WindowsのPython3ではos.fork関数は対応していません。よって、ここではLinuxであるUbuntu20.10とPython3.9.1を用いた解説をします。
os._exit関数の引数に数値(整数)を返すと終了コードになり、親プロセスで取得できます。通常、終了コードは0が正常終了で、1(0以外)が異常終了になります。
下記のプログラムはos.fork関数で子プロセスを作成し、子プロセス側でexec_codeのプログラムを実行します。親プロセスは必要な処理が終わったらos.waitpid関数を呼び出して子プロセスが終了するまで待ちます。子プロセスが終了したら終了コードを得て終了します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
# Linux(Ubuntu20.10)とPython3.9.1で動作確認しました。
# Windowsでは動作しませんのでご注意ください。
exec_code = '''
# 子プロセスのプログラム
import time
import os
import sys
# 下の[if i == 5:]のブロックをコメントにして、
# killコマンドで子プロセスを強制終了したらどうなるかもご覧ください
for i in range(200): # 200回ループ
print(i)
if i == 5: # iが5になったらos._exitを実行し、終了します
print(“os.exit実行”)
os._exit(2) # 確認のため 2 にしてあります
time.sleep(1)
os._exit(3) # 確認のために 3 にしてあります
'''
# 親プロセスのプログラム
import time
import os
import sys
# プロセスをコピーして子プロセスを作ります
pid = os.fork()
# 親プロセスか子プロセスかによって処理分け
if pid == 0: # 子プロセスのとき(pid == 0)、実行します
exec(exec_code)
else: # 親プロセスのとき、実行します
print(“子プロセス pid=“,pid)
for i in range(20):
print( i/2 )
time.sleep(0.5)
# 親プロセスとしての必要な処理をし終わったら、
# os.waitpidを呼び出して子プロセスが終了するのを待つ
info = os.waitpid(pid, 0)
if os.WIFEXITED(info[1]):
code = os.WEXITSTATUS(info[1]) # 終了コードを得る
print(“子プロセスの終了コード =“, code)
else:
print(“強制終了されました”)
|
こちらが実行結果になります。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
子プロセス pid= 625
0.0
0
0.5
1
1.0
1.5
2
2.0
2.5
3
3.0
3.5
4
4.0
4.5
5
os.exit実行
5.0
5.5
6.0
6.5
7.0
7.5
8.0
8.5
9.0
9.5
子プロセスの終了コード = 2
|
Pythonのexitの使い方
Pythonのexit関数はインタラクティブシェルまたはプロセスを終了させるための関数です。
組み込み関数のexit関数はインタラクティブシェルを終了させるために使用します。sys.exit関数はメインプロセスを終了させるのに使用します。プログラム途中で終了させる場合には、このsys.exit関数を用います。
引数には終了コードか文字列を指定します。終了コードは通常(異常のないとき)は0を指定します。異常なときは1(0以外)を指定します。文字列を指定すると終了コードは1が返ります。
os._exit関数はos.fork関数で子プロセスを作成したときに、子プロセス側で終了するときに使います。親プロセスは子プロセスが終了するのを待ってから終了するのが一般的です。なお、WindowsのPython3ではos.fork関数は使えません。ご注意ください。
os._exit関数について少し補足しておきますと、os._exit関数はWindowsにもあります。os._exit関数は例外を発生させるのではなく強制終了してしまうため、安全な終了の仕方ではありません。そのため通常はsys.exit関数を用いた方が良いでしょう。
どうしても「直ちに終了したい」とか、強制終了しても安全なことが分かっている場合に限り、os._exit関数を用いても良いでしょう。
- システム
エンジニア - Pythonの3種類のexit関数から適切なexit関数を選んで使えるように練習します。
- プロジェクト
マネージャー - ご紹介した方法を参考にして適切なexit関数を選んで使えるようにしっかり理解して活用してください。
最後に
exitは3種類ありましたが、理解して頂けたでしょうか。
いずれのexit関数も最終的には「終了コードを返してプロセスを終了する」という同じ動作のため、区別し難くなっています。
WindowsのPython3ではos.fork関数が使えないので、その部分だけLinux(Ubuntu)を用いて解説しました。できることならWindowsで全部統一したかったのですが、今回は仕方ありません。
sys.exit関数ではプロセスの終了コードが返せますので、コマンドプロンプトの環境変数ERRORLEVELで取得できます。そうすればバッチファイルで処理分けして、更に処理を自動化できたりします。
FEnet.NETナビ・.NETコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。
-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。
Python新着案件New Job
-
マルチロガーソフト開発/東京都豊島区/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円東京都豊島区(池袋駅) -
マルチロガーソフト開発/東京都豊島区/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円東京都豊島区(池袋駅) -
商品化予定の振動センサーの運用保守/Python/東京都都内/【WEB面談可】
月給50万~60万円東京都都内(-駅) -
商品化予定の振動センサーの可視化UI開発のテスター/Python/東京都都内/【WEB面談可】
月給25万~35万円東京都都内(-駅) -
商品化予定の振動センサーの運用保守/Python/東京都都内/【WEB面談可】
月給50万~60万円東京都都内(-駅) -
商品化予定の振動センサーの可視化UI開発のテスター/Python/東京都都内/【WEB面談可】
月給25万~35万円東京都都内(-駅)