1. ホーム
  2. python

[解決済み] Pythonのexit()とsys.exit()の違いについて

2022-03-22 03:15:13

質問

Pythonでは、似たような名前の関数が2つあります。 exit()sys.exit() . どのような違いがあり、どのような場合にどちらを使うべきでしょうか?

どのように解決するのですか?

exit は、対話型シェル用のヘルパーです。 sys.exit は、プログラムでの利用を想定しています。

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


技術的には、ほとんど同じです。 SystemExit . sys.exit ではそうなっています。 sysmodule.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() ).