2011-06-28 42 views

答えて

363

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

-Sコマンドラインオプションが指定されている場合を除いて、起動時に自動的にインポートされる)siteモジュールが内蔵された名前空間(例えばexitにいくつかの定数を加算します。 これらはインタラクティブなインタプリタシェルに便利であり、プログラムで使用すべきではありません。


技術的に、彼らはほとんど同じ操作を行います。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; 
} 

exitsite.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()の後にのみ使用する必要があります)。

+2

exit(main())は、*プログラムでは使用しないでください*ノートでピックアップしないので、普通のイディオムと思われます。 ['-S'](http://docs.python.org/using/cmdline.html#cmdoption-S)を使用しない限りうまく動作します。 '-S'でも動作させる方法は、' from sys import * 'を指定することです。 – nobar

+5

@nobar、trueですが、あなたは本当に 'from module import *'を使いたくありません。 – miku

+1

他のスレッドで 'SystemExit'がどのように発生していますか?それとも? –

7

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

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