Pythonには、同様の名前の関数が2つあります(exit()
とsys.exit()
)。違いは何ですか?また、いつ別のものを使うべきですか?Pythonのexit()とsys.exit()の違い
293
A
答えて
363
exit
は、対話シェルのヘルパーです。sys.exit
は、プログラムでの使用を意図しています。
(
-S
コマンドラインオプションが指定されている場合を除いて、起動時に自動的にインポートされる)site
モジュールが内蔵された名前空間(例えば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で定義されている間:クリーンアップハンドラを呼び出すことなく出て3番目の出口オプション、すなわちos._exitがあること
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')
注意、紅潮しますstdioバッファーなど(通常、子プロセスではfork()
の後にのみ使用する必要があります)。
7
コードでexit()
を使用してシェルで実行すると、プログラムを強制終了するかどうかを尋ねるメッセージが表示されます。それは本当に邪魔です。 See here
しかし、この場合はsys.exit()
です。プログラムを終了し、ダイアログボックスを作成しません。
exit(main())は、*プログラムでは使用しないでください*ノートでピックアップしないので、普通のイディオムと思われます。 ['-S'](http://docs.python.org/using/cmdline.html#cmdoption-S)を使用しない限りうまく動作します。 '-S'でも動作させる方法は、' from sys import * 'を指定することです。 – nobar
@nobar、trueですが、あなたは本当に 'from module import *'を使いたくありません。 – miku
他のスレッドで 'SystemExit'がどのように発生していますか?それとも? –