web-dev-qa-db-ja.com

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

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

344
Drake Guan

exit は対話型シェルのためのヘルパーです - sys.exit はプログラムでの使用を意図しています。

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


技術的には、ほとんど同じです: SystemExit を上げる。 sys.exitsysmodule.c /でそうします。

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;
}

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()の後の子プロセスでのみ使用されます)。

409
miku

コードでexit()を使用してシェルで実行すると、プログラムを強制終了するかどうかを尋ねるメッセージが表示されます。本当に厄介です。 ここをクリック

しかし、この場合はsys.exit()のほうが優れています。プログラムを閉じて、ダイアログボックスを作成しません。

16