Perbedaan antara exit () dan sys.exit () dalam Python

409

Dalam Python, ada dua fungsi dengan nama yang sama, exit()dan sys.exit(). Apa bedanya dan kapan saya harus menggunakannya?

Drake Guan
sumber

Jawaban:

471

exitadalah penolong untuk shell interaktif - sys.exitdimaksudkan untuk digunakan dalam program.

The sitemodul (yang diimpor secara otomatis saat startup, kecuali jika -Sopsi baris perintah yang diberikan) menambahkan beberapa konstanta untuk built-in namespace (misalnya exit) . Mereka berguna untuk shell interpreter interaktif dan tidak boleh digunakan dalam program .


Secara teknis, mereka kebanyakan melakukan hal yang sama: membesarkan SystemExit. sys.exitmelakukannya di 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;
}

Sementara exitdidefinisikan masing-masing dalam site.py dan _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')

Perhatikan bahwa ada opsi keluar ketiga, yaitu os._exit , yang keluar tanpa memanggil penangan pembersihan, pembilasan stdio buffer, dll. (Dan yang biasanya hanya digunakan dalam proses anak setelah a fork()).

miku
sumber
4
Saya menduga bahwa exit (main ()) adalah idiom umum karena orang-orang tidak mengambil pada seharusnya tidak digunakan dalam catatan program . Ini berfungsi dengan baik kecuali -Sdigunakan. Cara untuk membuatnya bekerja dengan -Sadalah untuk menentukan from sys import *.
nobar
5
@ nobar, benar, tetapi kemudian Anda tidak benar-benar ingin menggunakannya from module import *.
miku
@ EvgeniSergeev, saya tidak yakin apa yang sebenarnya Anda tanyakan? Mungkin ini pertanyaan yang menarik.
miku
Ini akan menjadi tambahan yang bagus untuk jawaban ini untuk melihat masalah apa jika ada di sana untuk menggunakan salah satu dari tiga fungsi keluar dalam "dengan pernyataan."
DevPlayer
32

Jika saya menggunakan exit()kode dan menjalankannya di shell, itu menunjukkan pesan yang menanyakan apakah saya ingin mematikan program atau tidak. Benar-benar mengganggu. Lihat disini

Tetapi sys.exit()lebih baik dalam hal ini. Itu menutup program dan tidak membuat kotak dialog.

Ramisa Anjum Aditi
sumber
2
Ini karena dirancang untuk digunakan dalam shell interaktif. Jadi, bahkan jika Anda ingin dialog, sys.exit()harus digunakan di dalam program.
TheTechRobo36414519