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?

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()).


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.


2
Ini karena dirancang untuk digunakan dalam shell interaktif. Jadi, bahkan jika Anda ingin dialog, sys.exit()harus digunakan di dalam program.
— TheTechRobo36414519
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.