Perintah keluar Python - mengapa begitu banyak dan kapan masing-masing harus digunakan?

489

Tampaknya python mendukung banyak perintah berbeda untuk menghentikan eksekusi skrip.
Pilihan saya telah menemukan adalah: quit(), exit(), sys.exit(),os._exit()

Apakah saya melewatkan satu pun? Apa perbedaan di antara mereka? Kapan Anda akan menggunakan masing-masing?

Jonathan
sumber
1
Anda telah melewatkanos.abort()
The Daleks

Jawaban:

765

Biarkan saya memberi beberapa informasi tentang mereka:

  1. quit()hanya menimbulkan SystemExitpengecualian.

    Selanjutnya, jika Anda mencetaknya, itu akan memberikan pesan:

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

    Fungsi ini dimasukkan untuk membantu orang yang tidak tahu Python. Setelah semua, salah satu hal yang paling mungkin seorang pemula akan mencoba untuk keluar dari Python adalah mengetik quit.

    Namun demikian, quitsebaiknya tidak digunakan dalam kode produksi. Ini karena ini hanya berfungsi jika sitemodul dimuat. Sebagai gantinya, fungsi ini hanya boleh digunakan pada juru bahasa.

  2. exit()adalah alias untuk quit(atau sebaliknya). Mereka ada bersama hanya untuk membuat Python lebih mudah digunakan.

    Selain itu, ia juga memberikan pesan saat dicetak:

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

    Namun, seperti quit, exitdianggap buruk untuk digunakan dalam kode produksi dan harus disediakan untuk digunakan dalam juru bahasa. Ini karena terlalu bergantung pada sitemodul.

  3. sys.exit()juga memunculkan SystemExiteksepsi. Ini berarti bahwa itu sama dengan quitdan exitdalam hal itu.

    Namun tidak seperti keduanya, sys.exitdianggap baik untuk digunakan dalam kode produksi. Ini karena sysmodul akan selalu ada.

  4. os._exit()keluar dari program tanpa memanggil penangan pembersihan, pembilasan stdio penyangga, dll . Dengan demikian, ini bukan cara standar untuk keluar dan hanya boleh digunakan dalam kasus khusus. Yang paling umum adalah dalam proses anak yang dibuat oleh os.fork.

    Perhatikan bahwa, dari empat metode yang diberikan, hanya yang ini unik dalam fungsinya.

Disimpulkan, keempat metode keluar dari program. Namun, dua yang pertama dianggap buruk untuk digunakan dalam kode produksi dan yang terakhir adalah cara yang tidak standar dan kotor yang hanya digunakan dalam skenario khusus. Jadi, jika Anda ingin keluar dari program yang biasanya, pergi dengan metode ketiga: sys.exit.


Atau, bahkan lebih baik menurut saya, Anda bisa langsung melakukan apa yang sys.exitada di balik layar dan berlari:

raise SystemExit

Dengan cara ini, Anda tidak perlu mengimpor systerlebih dahulu.

Namun, pilihan ini hanya satu pada gaya dan murni terserah Anda.

mhsmith
sumber
2
Tapi di shell ipython, quitdan exitkeluar dari shell sementara sys.exittidak.
Lee
5
sys.exit()bukan cara yang dapat diandalkan untuk menutup. Jika disebut di dalam utas, ia hanya akan menghentikan utas itu kecuali jika ada di utas utama. Hal ini dapat menyebabkan banyak kasus di mana program berlanjut karena panggilan itu tidak ada di utas utama, terutama karena beberapa penerjemah akan secara tidak kasat mata memanggil panggilan.
Elliot
1
Saya memilih untuk menambahkan endperintah yang akan raise SystemExit. Tidak mengerti mengapa tidak ada sesuatu yang sederhana seperti itu, seperti pada BASIC.
Brian Burns
6
@BrianBurns: Tidak perlu menambahkan sintaksis khusus dan memesan kata kunci lain. Ini mirip dengan mengapa printdiubah dari pernyataan ke fungsi. Sangat mudah untuk menambahkan sintaks, tetapi ada biaya kerumitan untuk melakukannya.
user2357112 mendukung Monica
1
Apakah tanda kurung penting saat menelepon sys.exit()?
lindhe
100

Fungsi * quit() ,, exit()dan sys.exit()berfungsi dengan cara yang sama: mereka memunculkan SystemExiteksepsi. Jadi tidak ada perbedaan nyata, kecuali yang sys.exit()selalu tersedia tetapi exit()dan quit()hanya tersedia jika sitemodul diimpor.

The os._exit()fungsi khusus, keluar segera tanpa memanggil fungsi-fungsi pembersihan (itu tidak flush buffer, misalnya). Ini dirancang untuk kasus penggunaan yang sangat khusus ... pada dasarnya, hanya pada anak setelah os.fork()panggilan.

Kesimpulan

  • Gunakan exit()atau quit()dalam REPL.

  • Gunakan sys.exit()dalam skrip, atau raise SystemExit()jika Anda mau.

  • Gunakan os._exit()untuk proses anak untuk keluar setelah panggilan ke os.fork().

Semua ini dapat dipanggil tanpa argumen, atau Anda dapat menentukan status keluar, misalnya, exit(1)atau raise SystemExit(1)keluar dengan status 1. Perhatikan bahwa program portabel terbatas untuk keluar dari kode status dalam kisaran 0-255, jika Anda raise SystemExit(256)pada banyak sistem ini akan terpotong dan proses Anda benar-benar akan keluar dengan status 0.

Catatan kaki

* Sebenarnya, quit()dan exit()merupakan objek instance yang bisa dipanggil, tapi saya pikir tidak apa-apa untuk memanggilnya fungsi.

Dietrich Epp
sumber
50

Cara Keluar yang Berbeda

os._exit():

  • Keluar dari proses tanpa memanggil penangan pembersihan.

exit(0):

  • jalan keluar yang bersih tanpa kesalahan / masalah.

exit(1):

  • Ada beberapa masalah / kesalahan / masalah dan itulah sebabnya program ini keluar.

sys.exit():

  • Ketika sistem dan python dimatikan; itu berarti lebih sedikit memori yang digunakan setelah program dijalankan.

quit():

  • Menutup file python.

Ringkasan

Pada dasarnya mereka semua melakukan hal yang sama, namun, itu juga tergantung pada apa yang Anda lakukan.

Saya tidak berpikir Anda meninggalkan sesuatu dan saya akan merekomendasikan untuk terbiasa quit()atau exit().

Anda akan menggunakan sys.exit()dan os._exit()terutama jika Anda menggunakan file besar atau menggunakan python untuk mengontrol terminal.

Atau terutama menggunakan exit()atau quit().

Mike Williamson
sumber
42

sys.exit adalah cara kanonik untuk keluar.

Secara internal sys.exithanya menaikkan SystemExit. Namun, panggilan sys.exitlebih idiomatis daripada mengangkat SystemExitsecara langsung.

os.exit adalah panggilan sistem tingkat rendah yang keluar secara langsung tanpa memanggil penangan pembersihan.

quitdan exitada hanya untuk memberikan jalan keluar yang mudah dari Python prompt. Ini untuk pengguna baru atau pengguna yang secara tidak sengaja memasukkan prompt Python, dan tidak ingin tahu sintaks yang tepat. Mereka cenderung mencoba mengetik exitatau quit. Meskipun ini tidak akan keluar dari juru bahasa, itu setidaknya mengeluarkan pesan yang memberi tahu mereka jalan keluar:

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

Ini pada dasarnya hanya peretasan yang memanfaatkan fakta bahwa penerjemah mencetak __repr__ekspresi apa pun yang Anda masukkan saat diminta.

Oefe
sumber