Python'da exit () ve sys.exit () arasındaki fark


409

Python'da, benzer şekilde adlandırılmış iki işlev vardır exit()ve sys.exit(). Aradaki fark nedir ve ne zaman diğerinin üzerinde kullanmalıyım?

Yanıtlar:


471

exitetkileşimli kabuk için bir yardımcıdır - sys.exitprogramlarda kullanılmak üzere tasarlanmıştır.

site(Eğer hariç, başlangıç sırasında otomatik olarak alınır modül -Skomut satırı seçeneği verilir) yerleşik ad alanına birkaç sabitleri ekler (örneğin exit) . İnteraktif tercüman kabuğu için kullanışlıdır ve programlarda kullanılmamalıdır .


Teknik olarak, çoğunlukla aynı şeyi yaparlar: yükseltme SystemExit. sysmodule.c'desys.exit bunu yapar :

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 sırası ile site.py ve _sitebuiltins.py'deexit tanımlanmıştır .

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

Temizleme işleyicilerini çağırmadan, stdio tamponlarını temizlemeden vb. Çıkan (ve normalde yalnızca a işleminden sonra alt süreçte kullanılması gereken) üçüncü bir çıkış seçeneğinin, yani os._exit olduğunu unutmayın fork().


4
Çıkış (main ()) yaygın bir deyim olduğundan şüpheliyim çünkü insanlar almıyorsa program notunda kullanılmamalıdır . -SKullanılmadığı sürece iyi çalışır . Hatta çalışmasını sağlamanın bir yolu -Sbelirtmektir from sys import *.
nobar

5
@nobar, true, ama sonra gerçekten kullanmak istemiyorsunuz from module import *.
miku

@EvgeniSergeev, tam olarak ne istediğini bilmiyorum? Kendi başına ilginç bir soru olabilir.
miku

Bir "with deyimi" içindeki üç çıkış işlevinden herhangi birini kullanmak için varsa hangi sorunları varsa görmek, bu yanıta hoş bir ek olacaktır.
DevPlayer

32

Ben kullanırsanız exit()bir kod ve kabukta çalıştırın, ben programı öldürmek ya da değil isteyip istemediğinizi soran bir mesaj görüntülenir. Gerçekten rahatsız edici. Buraya bakın

Ancak sys.exit()bu durumda daha iyidir. Programı kapatır ve herhangi bir iletişim kutusu oluşturmaz.


2
Bunun nedeni, etkileşimli kabukta kullanılmak üzere tasarlanmış olmasıdır. Yani diyaloğu isteseniz bile, sys.exit()programların içinde kullanılmalıdır.
TheTechRobo36414519
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.