Diferença entre exit () e sys.exit () em Python

409

No Python, existem duas funções com nomes semelhantes exit()e sys.exit(). Qual é a diferença e quando devo usar um sobre o outro?

Drake Guan
fonte

Respostas:

471

exité um auxiliar do shell interativo - sys.exité destinado ao uso em programas.

O sitemódulo (que é importado automaticamente durante a inicialização, exceto se a -Sopção da linha de comandos for fornecida) adiciona várias constantes ao espaço para nome interno (por exemplo exit) . Eles são úteis para o shell do interpretador interativo e não devem ser usados ​​em programas .


Tecnicamente, eles fazem basicamente o mesmo: aumentar SystemExit. sys.exitfaz isso no 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;
}

While exité definido em site.py e _sitebuiltins.py , respectivamente.

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')

Observe que existe uma terceira opção de saída, os._exit , que sai sem chamar manipuladores de limpeza, liberar buffers stdio, etc. (e que normalmente deve ser usado apenas no processo filho após a fork()).

miku
fonte
4
Eu suspeito que exit (main ()) é um idioma comum, porque as pessoas que não entendem o assunto não devem ser usadas nos programas . Funciona bem, a menos que -Sseja usado. Uma maneira de fazê-lo funcionar mesmo com -Sé especificar from sys import *.
#
5
@nobar, é verdade, mas você realmente não quer usar from module import *.
Miku
@EvgeniSergeev, não sei exatamente o que você está perguntando? Pode ser uma pergunta interessante por si só.
Miku
Seria uma boa adição a esta resposta para ver quais problemas existem, se houver, para usar qualquer uma das três funções de saída em uma declaração "with".
DevPlayer
32

Se eu usar exit()um código e executá-lo no shell, ele mostrará uma mensagem perguntando se eu quero matar o programa ou não. É realmente perturbador. Veja aqui

Mas sys.exit()é melhor neste caso. Ele fecha o programa e não cria nenhuma caixa de diálogo.

Ramisa Anjum Aditi
fonte
2
Isso ocorre porque ele foi projetado para uso no shell interativo. Portanto, mesmo se você quiser a caixa de diálogo, sys.exit()deve ser usado dentro de programas.
TheTechRobo36414519