2022.01.16  

【Python】呼び出した処理にexitがあってもプログラムを終了させないようにする

Python    

呼び出した処理の中にexitがあってもプログラムを終了させないようにする方法をメモ書きします。
今回は諸事情によりreturnへの書き換えが行えない状況です。

exitとreturnの違い

exitreturnの違いはざっくり言うと次の通り。

exit:実行するとプログラムが終了する
return:呼び出し元関数に値を返し、呼び出し元関数を終了する

処理内容

main_process.pyを実行した際に後続処理Aを表示させたいのですが、手前のexit_process.execute()を実行すると、exit(0)によりプログラムの実行が終了してしまいます。
exitreturnに書き換えれば話は早いのですが、今回はexitのままにしておきたい状況です。

main_process.py
from work import exit_process


exit_process.execute()
print("後続処理A")
exit_process.py
def execute():
    print("exitを実行します")
    exit(0)
実行結果
exitを実行します

プロセスは終了コード 0 で完了しました

解決方法

exit()BaseException例外を投げることによってプログラムを終了する仕組みとなっています。
つまり、tryブロックの中で呼べばプログラムが終了しなくなります。
main_process.pyを次のように書き換えて実行してみます。

main_process.py
from work import exit_process


try:
    exit_process.execute()

except BaseException as e:
    print(e)
    print("後続処理A")

すると、後続処理Aが表示させるようになりました。
exitの戻り値はeから取得できます。

実行結果
exitを実行します
0
後続処理A

プロセスは終了コード 0 で完了しました

if文を使用する際の注意点

exitの戻り値をeで受け取りif文で条件分岐を行うことができますが、eの型はSystemExitなので文字列型に変換してから使用する必要があります。

戻り値が0なのに上手く条件分岐しない

main_process.py
from work import exit_process


try:
    exit_process.execute()

except BaseException as e:
    print(type(e))
    print(e)

    if 0 == e:
        print("後続処理A")
    else:
        print("後続処理B")
実行結果
exitを実行します
<class 'SystemExit'>
0
後続処理B

プロセスは終了コード 0 で完了しました

文字列に変換すると上手く条件分岐する

if 0 == e:if "0" == str(e)に書き換えると意図した通りに動作します。

main_process.py
from work import exit_process


try:
    exit_process.execute()

except BaseException as e:
    print(type(e))
    print(e)

if "0" == str(e):
        print("後続処理A")
    else:
        print("後続処理B")
実行結果
exitを実行します
<class 'SystemExit'>
0
後続処理A

プロセスは終了コード 0 で完了しました
コメント
現在コメントはありません。
コメントする
コメント入力

名前 (※ 必須)

メールアドレス (※ 必須 画面には表示されません)

送信