2011-06-28 9 views

Odpowiedz

363

exit jest pomocnikiem dla powłoki interaktywnej - sys.exit jest przeznaczona do stosowania w programach.

Moduł site (który jest importowany automatycznie podczas uruchamiania systemu, chyba że opcja wiersza polecenia -S jest podana) dodaje kilka stałych do wbudowanego w przestrzeni nazw (np exit). Są one użyteczne dla powłoki interpretera interaktywnego i nie powinny być używane w programach.


Technicznie, robią przeważnie takie same: podnoszenie SystemExit. sys.exit czyni to w 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; 
} 

Podczas exit jest zdefiniowana w site.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') 

Należy pamiętać, że jest jeszcze trzecia opcja wyjścia, mianowicie os._exit, który wychodzi bez wywoływania procedur obsługi czyszczenia, spłukiwania bufory stdio itp. (i które normalnie powinny być używane tylko w procesie potomnym po fork()).

+2

Podejrzewam, że wyjście (main()) jest pospolitym idiomem, ponieważ ludzie nie odbierają * nie powinny być używane w programach * uwaga. Działa dobrze, chyba że użyto ['-S'] (http://docs.python.org/using/cmdline.html#cmdoption-S). Sposobem na jego działanie nawet przy '-S' jest określenie' from sys import * '. – nobar

+5

@nobar, prawda, ale tak naprawdę nie chcesz używać 'from module import *'. – miku

+1

Więc w jaki sposób 'SystemExit' jest podniesiony w innych wątkach? Czy to nawet? –

7

Jeśli użyję exit() w kodzie i uruchomię go w powłoce, wyświetli się komunikat z pytaniem, czy chcę zabić program, czy nie. To naprawdę niepokojące. See here

Ale w tym przypadku jest lepiej sys.exit(). Zamyka program i nie tworzy żadnego okna dialogowego.

Powiązane problemy