Python çıkış komutları - neden bu kadar çok ve ne zaman kullanılmalı?


489

Python komut dosyasının yürütülmesini durdurmak için birçok farklı komutu destekliyor gibi görünüyor.
Bulduğum seçenekleri şunlardır: quit(), exit(), sys.exit(),os._exit()

Hiç kaçırdım mı? Aralarındaki fark nedir? Her birini ne zaman kullanırsınız?


1
Sen kaçırdığınızıos.abort()
Dalekleri

Yanıtlar:


765

Onlar hakkında biraz bilgi vereyim:

  1. quit()sadece SystemExitistisnayı ortaya çıkarır .

    Ayrıca, yazdırırsanız, bir mesaj verecektir:

    >>> print (quit)
    Use quit() or Ctrl-Z plus Return to exit
    >>>
    

    Bu işlevsellik, Python'u tanımayan kişilere yardımcı olmak için dahil edildi. Sonuçta, bir aceminin Python'dan çıkmaya çalışacağı en olası şeylerden biri yazıyor quit.

    Bununla birlikte, quitgerektiği değil üretim kodunda kullanılabilir. Bunun nedeni sadece sitemodül yüklüyse çalışmasıdır. Bunun yerine, bu işlev yalnızca yorumlayıcıda kullanılmalıdır.

  2. exit(), quit(veya tam tersi) için bir takma addır. Python'u daha kullanıcı dostu hale getirmek için birlikte var olurlar.

    Ayrıca, yazdırıldığında da bir mesaj verir:

    >>> print (exit)
    Use exit() or Ctrl-Z plus Return to exit
    >>>
    

    Ancak, böyle quit, exitüretim kodunda kullanmak kötü olarak kabul edilir ve tercüman kullanılmak üzere ayrılmalıdır. Bunun nedeni sitemodüle de bağlı olmasıdır.

  3. sys.exit()aynı zamanda SystemExitistisnayı da gündeme getiriyor . Bu demek oluyor ki, onunla aynı quitve exitbu açıdan.

    Ancak bu ikisinin aksine sys.exitüretim kodunda kullanılması iyi kabul edilir. Çünkü sysmodül her zaman orada olacaktır.

  4. os._exit()temizleme işleyicilerini çağırmadan, stdio arabelleklerini vb . temizlemeden programdan çıkar . Bu nedenle, çıkmak için standart bir yol değildir ve sadece özel durumlarda kullanılmalıdır. Bunlardan en yaygın olanı, tarafından oluşturulan alt süreç (ler) dir os.fork.

    Verilen dört yöntemin sadece bu yöntemde benzersizdir.

Özetle, dört yöntemin tümü programdan çıkar. Bununla birlikte, ilk ikisinin üretim kodunda kullanılması kötü olarak kabul edilir ve sonuncusu sadece özel senaryolarda kullanılan standart olmayan, kirli bir yoldur. Normalde bir program çıkmak istiyor Yani, üçüncü yöntemi ile gidin: sys.exit.


Ya da, bence daha da iyisi, doğrudan sys.exitperde arkasında ne yapabilir ve koşabilirsiniz:

raise SystemExit

Bu şekilde, sysönce içe aktarmanıza gerek yoktur .

Ancak, bu seçim sadece tarzda bir seçimdir ve tamamen size bağlıdır.


2
Ama ipython kabuğunda quitve bırakmadan kabuğundan exitçıkın sys.exit.
Lee,

5
sys.exit()kapatmanın güvenilir bir yolu değildir. Bir iş parçacığının içinde çağrılırsa, ana iş parçacığında olmadığı sürece yalnızca bu iş parçacığını sonlandıracaktır. Bu, özellikle bazı tercümanlar görünmez bir şekilde çağrıları işleyeceği için, çağrı ana iş parçacığında olmadığı için programın devam ettiği birçok duruma yol açabilir.
Elliot

1
Ben bir endkomut eklemek için oy raise SystemExit. BASIC'te olduğu gibi neden böyle basit bir şey olamaz.
Brian Burns

6
@BrianBurns: Özel sözdizimi eklemeye ve başka bir anahtar kelime ayırmaya değmez. Bu, printbir ifadeden bir işleve neden değiştirildiğine benzer . Sözdizimi eklemek kolaydır, ancak bunu yaparken karmaşıklık maliyeti vardır.
user2357112 Monica

1
Parantez aranırken önemli sys.exit()mi?
Aralık'ta

100

Fonksiyonları * quit() , exit()ve sys.exit()aynı şekilde işlev: Onlar yükseltmek SystemExitistisna. Dışında Yani gerçek fark yoktur sys.exit()her zaman mevcuttur, ancak exit()ve quit()yalnızca kullanılabilir sitemodül alınır.

os._exit()Fonksiyonu (örneğin, bir hizada değil tampon yok) herhangi bir temizleme işlevlerini çağırmadan hemen çıkar, özeldir. Bu, son derece uzmanlaşmış kullanım durumları için tasarlanmıştır ... temel olarak, sadece os.fork()çağrıdan sonra çocukta .

Sonuç

  • REPL içinde exit()veya kullanın quit().

  • sys.exit()Komut dosyalarında veya raise SystemExit()isterseniz kullanın .

  • os._exit()Bir çağrıdan sonra alt işlemlerin çıkması için kullanın os.fork().

Bunların tümü bağımsız değişkenler olmadan çağrılabilir veya çıkış durumunu, örneğin exit(1)veya raise SystemExit(1)durum 1 ile çıkmak için belirtebilirsiniz. Taşınabilir programların 0-255 aralığındaki çıkış durum kodlarıyla sınırlı olduğunu unutmayın raise SystemExit(256). kesilir ve işleminiz durum 0 ile gerçekten çıkacaktır.

Dipnotlar

* Aslında, quit()ve exit()çağrılabilir örnek nesneler, ama onlara fonksiyonları çağırmak için uygun olduğunu düşünüyorum.


50

Farklı Çıkış Araçları

os._exit():

  • Temizleme işleyicilerini çağırmadan işlemden çıkın.

exit(0):

  • herhangi bir hata / sorun olmadan temiz bir çıkış.

exit(1):

  • Bazı sorun / hata / sorun vardı ve bu yüzden programdan çıkılıyor.

sys.exit():

  • Sistem ve python kapatıldığında; bu, program çalıştırıldıktan sonra daha az bellek kullanıldığı anlamına gelir.

quit():

  • Python dosyasını kapatır.

özet

Temel olarak hepsi aynı şeyi yapar, ancak aynı zamanda ne için yaptığınıza da bağlıdır.

Hiçbir şeyi dışarıda bıraktığınızı sanmıyorum ve quit()ya da alışmanızı tavsiye ederim exit().

Sen kullanmak istiyorsunuz sys.exit()ve os._exit()sen büyük dosyaları kullanıyor veya terminal kontrol etmek python kullanırken özellikle eğer.

Aksi takdirde esas olarak exit()veya kullanın quit().


42

sys.exit kanonik çıkış yoludur.

Dahili olarak sys.exityükselir SystemExit. Bununla birlikte, çağrı doğrudan sys.exityükseltmekten daha deyimseldir SystemExit.

os.exit temizleme işleyicilerini çağırmadan doğrudan çıkan düşük düzeyli bir sistem çağrısıdır.

quitve exitsadece Python isteminden kolay bir çıkış yolu sağlamak için var. Bu, yeni kullanıcılar veya yanlışlıkla Python istemine giren ve doğru sözdizimini bilmek istemeyen kullanıcılar içindir. exitVeya yazmayı deneyebilirler quit. Bu yorumlayıcıdan çıkmayacak olsa da, en azından onlara bir çıkış yolu söyleyen bir mesaj yayınlar:

>>> exit
Use exit() or Ctrl-D (i.e. EOF) to exit
>>> exit()
$

Bu aslında yorumlayıcının __repr__bilgi istemine girdiğiniz herhangi bir ifadeyi yazdırdığı gerçeğini kullanan bir hack'tir .

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.