Pythonでのexit()とsys.exit()の違い


409

Pythonには、似た名前の2つの関数とがexit()ありsys.exit()ます。違いは何ですか?いつどちらを使用するべきですか?

回答:


471

exitインタラクティブシェルのヘルパーです- sys.exitプログラムでの使用を目的としています。

site(場合を除き、起動時に自動的にインポートされ、モジュール-Sのコマンドラインオプションが指定されている)は、組み込みの名前空間にいくつかの定数を追加します(例exitこれらは対話型インタープリターシェルに役立ち、プログラムでは使用しないでください


技術的には、ほとんど同じですSystemExitsysmodule.cでsys.exitそうします

static PyObject *
sys_exit(PyObject *self, PyObject *args)
{
    PyObject *exit_code = 0;
    if (!PyArg_UnpackTuple(args, "exit", 0, 1, &exit_code))
        return NULL;
    /* Raise SystemExit so callers may catch it or clean up. */
    PyErr_SetObject(PyExc_SystemExit, exit_code);
   return NULL;
}

while exitはそれぞれsite.py_sitebuiltins.pyで定義されています。

class Quitter(object):
    def __init__(self, name):
        self.name = name
    def __repr__(self):
        return 'Use %s() or %s to exit' % (self.name, eof)
    def __call__(self, code=None):
        # Shells like IDLE catch the SystemExit, but listen when their
        # stdin wrapper is closed.
        try:
            sys.stdin.close()
        except:
            pass
        raise SystemExit(code)
__builtin__.quit = Quitter('quit')
__builtin__.exit = Quitter('exit')

3番目の終了オプション、つまりos._exitがあることに注意してください。これは、クリーンアップハンドラーの呼び出し、stdioバッファーのフラッシュなどを行わずに終了します(通常、の後の子プロセスでのみ使用する必要がありますfork())。


4
exit(main())は一般的なイディオムだと思われます。なぜなら、人々はプログラムのノートで使用されるべきではないことを理解していないからです。-S使用しない限り、正常に動作します。でも動作させる方法-Sは、を指定することfrom sys import *です。
nobar '20年

5
@ nobar、true、しかし実際には使用したくないfrom module import *
miku 2013

@EvgeniSergeev、私はあなたが正確に何を求めているのかわかりませんか?それ自体は興味深い質問かもしれません。
miku 2016年

「withステートメント」内で3つの出口関数のいずれかを使用するために何か問題がある場合は、この回答に追加するとよいでしょう。
DevPlayer 2016年

32

exit()コードで使用してシェルで実行すると、プログラムを強制終了するかどうかを尋ねるメッセージが表示されます。それは本当に不安です。 こちらをご覧ください

しかしsys.exit()、この場合はより良いです。プログラムを閉じ、ダイアログボックスを作成しません。


2
これは、対話型シェルで使用するように設計されているためです。したがって、ダイアログがsys.exit()必要な場合でも、プログラム内で使用する必要があります。
TheTechRobo36414519
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.