Python exitコマンド-なぜそんなに多く、いつそれぞれを使用する必要があるのですか?


489

Pythonは、スクリプトの実行を停止するためのさまざまなコマンドをサポートしているようです。
私が見つけた選択肢は次のとおりです。 quit()exit()sys.exit()os._exit()

見逃しましたか?それらの違いは何ですか?それぞれいつ使用しますか?


1
お見逃しos.abort()
ザデレクス

回答:


765

それらについていくつかの情報をあげましょう。

  1. quit()単にSystemExit例外を発生させます。

    さらに、それを印刷すると、次のメッセージが表示されます。

    >>> print (quit)
    Use quit() or Ctrl-Z plus Return to exit
    >>>
    

    この機能は、Pythonを知らない人を支援するために含まれていました。結局のところ、初心者がPythonを終了しようとする可能性が最も高いものの1つは、と入力することquitです。

    それにもかかわらず、製品コードでは使用しないquitください。これは、モジュールがロードされている場合にのみ機能するためです。代わりに、この関数はインタープリターでのみ使用する必要があります。site

  2. exit()のエイリアスですquit(またはその逆)。それらは単にPythonをよりユーザーフレンドリーにするために一緒に存在します。

    さらに、印刷するとメッセージも表示されます。

    >>> print (exit)
    Use exit() or Ctrl-Z plus Return to exit
    >>>
    

    ただし、のようにquitexit量産コードでの使用は不適切と見なされ、インタープリターでの使用のために予約する必要があります。これもsiteモジュールに依存しているためです。

  3. sys.exit()SystemExit例外も発生します。それは同じようである。この手段quitおよびexitその点で。

    ただし、これら2つとは異なりsys.exit、量産コードでの使用は適切と見なされています。これは、sysモジュールが常に存在するためです。

  4. os._exit()クリーンアップハンドラーの呼び出し、stdioバッファーのフラッシュなどを行わずにプログラム終了します。したがって、これは終了する標準的な方法ではなく、特別な場合にのみ使用する必要があります。これらの最も一般的なものは、によって作成された子プロセスos.forkです。

    指定された4つの方法のうち、この方法のみがその方法で一意であることに注意してください。

要約すると、4つのメソッドすべてがプログラムを終了します。ただし、最初の2つは量産コードでの使用が不適切と見なされ、最後の2つは非標準のダーティーな方法であり、特別なシナリオでのみ使用されます。したがって、プログラムを正常に終了する場合は、3番目の方法を使用しますsys.exit


または、私の意見ではさらに良いことに、sys.exit裏で実行することを直接実行して実行することができます。

raise SystemExit

この方法では、sys最初にインポートする必要はありません。

ただし、この選択はスタイルに基づくものであり、完全にあなた次第です。


2
しかし、ipythonシェルでは、シェルを終了しますがquitexit終了しsys.exitません。
リー

5
sys.exit()閉鎖するための信頼できる方法ではありません。スレッド内で呼び出された場合、メインスレッドでない限り、そのスレッドのみを終了します。これは、特に一部のインタープリターが目に見えない形で呼び出しをスレッド化するため、呼び出しがメインスレッドになかったためにプログラムが続行する多くの場合につながる可能性があります。
エリオット

1
endはそうするコマンドを追加することに投票しraise SystemExitます。BASICのように、そのような単純なものがあり得ない理由を理解しないでください。
ブライアンバーンズ

6
@BrianBurns:専用の構文を追加して別のキーワードを予約する価値はありません。これはprint、ステートメントから関数に変更された理由に似ています。構文を追加するのは簡単ですが、そのためには複雑なコストがかかります。
user2357112は

1
呼び出すときに括弧は重要sys.exit()ですか?
lindhe 2018

100

機能は* quit()exit()sys.exit()同じように機能を:彼らは上げるSystemExit例外を。それは除いだから、本当の違いは、ありませんsys.exit()常に利用可能ですが、exit()そしてquit()場合にのみ使用可能ですsiteモジュールがインポートされます。

このos._exit()関数は特別で、クリーンアップ関数を呼び出さずにすぐに終了します(たとえば、バッファーをフラッシュしません)。これは、高度に特殊化されたユースケース向けに設計されています...基本的には、os.fork()通話後の子供のみです。

結論

  • exit()またはquit()REPLで使用してください。

  • sys.exit()スクリプトで、または必要にraise SystemExit()応じて使用します。

  • os._exit()呼び出し後に終了する子プロセスに使用しos.fork()ます。

これらのすべては、引数なしで呼び出すことができるか、例えば、終了ステータスを指定することができますexit(1)raise SystemExit(1)あなたの場合、移植性のあるプログラムは、0〜255の範囲で終了ステータスコードに限定されていることを状況1.注意して終了するにはraise SystemExit(256)、多くのシステムでは、この意志切り捨てられ、プロセスは実際にステータス0で終了します。

脚注

*実は、quit()およびexit()呼び出し可能なインスタンスオブジェクトですが、私はそれがそれらの機能を呼び出すために大丈夫だと思います。


50

終了のさまざまな手段

os._exit()

  • クリーンアップハンドラーを呼び出さずにプロセスを終了します。

exit(0)

  • エラー/問題のないクリーンな出口。

exit(1)

  • いくつかの問題/エラー/問題があり、プログラムが終了しています。

sys.exit()

  • システムとpythonがシャットダウンしたとき。これは、プログラムの実行後に使用されるメモリが少ないことを意味します。

quit()

  • Pythonファイルを閉じます。

概要

基本的にそれらはすべて同じことを行いますが、それはあなたが何をしているのかにも依存します。

私はあなたが何かを省いたとは思わないので、quit()またはに慣れることを勧めexit()ます。

主に大きなファイルを使用sys.exit()os._exit()ている場合や、端末を制御するためにpythonを使用している場合に使用します。

それ以外の場合は、主にexit()またはを使用しますquit()


42

sys.exit 終了する標準的な方法です。

内部的にはsys.exit単に発生しSystemExitます。ただし、直接呼び出すsys.exitよりも呼び出しの方が慣用的ですSystemExit

os.exit クリーンアップハンドラーを呼び出さずに直接終了する低レベルのシステムコールです。

quitそしてexit、Pythonプロンプトから簡単に抜け出す方法を提供するためだけに存在します。これは、新しいユーザーまたは誤ってPythonプロンプトを入力し、正しい構文を知りたくないユーザー向けです。彼らは、タイピングを試す可能性がありますexitquit。これはインタープリターを終了しませんが、少なくとも、出口を示すメッセージを発行します。

>>> exit
Use exit() or Ctrl-D (i.e. EOF) to exit
>>> exit()
$

これは本質的に、インタプリタ__repr__がプロンプトで入力した式を出力するという事実を利用した単なるハックです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.