Saya mengetahui die()
perintah dalam PHP yang keluar dari skrip lebih awal.
Bagaimana saya bisa melakukan ini dengan Python?
sumber
Saya mengetahui die()
perintah dalam PHP yang keluar dari skrip lebih awal.
Bagaimana saya bisa melakukan ini dengan Python?
import sys
sys.exit()
rincian dari sys
dokumentasi modul :
sys.exit([arg])
Keluar dari Python. Ini diimplementasikan dengan meningkatkan
SystemExit
pengecualian, sehingga tindakan pembersihan yang ditentukan oleh klausatry
pernyataan akhirnya dihormati, dan dimungkinkan untuk mencegat upaya keluar di tingkat luar.Argumen optional arg dapat menjadi integer memberikan status exit (default ke nol), atau jenis lain dari objek. Jika bilangan bulat, nol dianggap "penghentian sukses" dan nilai bukan nol dianggap "penghentian abnormal" oleh kerang dan sejenisnya. Sebagian besar sistem mengharuskannya berada dalam kisaran 0-127, dan menghasilkan hasil yang tidak ditentukan. Beberapa sistem memiliki konvensi untuk menetapkan makna khusus untuk kode keluar tertentu, tetapi ini umumnya kurang berkembang; Program Unix umumnya menggunakan 2 untuk kesalahan sintaks baris perintah dan 1 untuk semua jenis kesalahan lainnya. Jika jenis objek lain dilewatkan, Tidak ada yang setara dengan melewati nol, dan objek lainnya dicetak ke
stderr
dan menghasilkan kode keluar dari 1. Secara khusus,sys.exit("some error message")
adalah cara cepat untuk keluar dari program saat terjadi kesalahan.Karena
exit()
pada akhirnya "hanya" menimbulkan pengecualian, itu hanya akan keluar dari proses ketika dipanggil dari utas utama, dan pengecualian tidak dicegat.
Perhatikan bahwa ini adalah cara 'bagus' untuk keluar. @ glyphtwistedmatrix di bawah ini menunjukkan bahwa jika Anda menginginkan 'hard exit', Anda dapat menggunakan os._exit(*errorcode*)
, meskipun kemungkinan os-spesifik sampai batas tertentu (misalnya, mungkin tidak mengambil kode galat di bawah jendela), dan itu pasti kurang ramah karena tidak membiarkan penerjemah melakukan pembersihan sebelum proses mati.
sys.exit()
tidak bekerja (tidak membunuh proses, hanya membunuh utas) jika dimunculkan oleh utas latar?sys.exit()
memunculkanSystemExit
pengecualian di utas saat ini.UserWarning: To exit: use 'exit', 'quit', or Ctrl-D. warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)
Cara sederhana untuk menghentikan skrip Python lebih awal adalah dengan menggunakan
quit()
fungsi bawaan. Tidak perlu mengimpor perpustakaan apa pun, dan itu efisien dan sederhana.Contoh:
sumber
Cara lain adalah:
sumber
sys.exit
Anda juga bisa menggunakannya secara sederhana
exit()
.Perlu diingat bahwa
sys.exit()
,exit()
,quit()
, danos._exit(0)
membunuh interpreter Python. Oleh karena itu, jika muncul dalam skrip yang dipanggil dari skrip lain olehexecfile()
, itu menghentikan eksekusi kedua skrip.Lihat " Hentikan eksekusi skrip yang dipanggil dengan execfile " untuk menghindari ini.
sumber
Meskipun Anda umumnya harus lebih suka
sys.exit
karena lebih "ramah" dengan kode lain, yang sebenarnya dilakukannya adalah meningkatkan pengecualian.Jika Anda yakin bahwa Anda harus segera keluar dari proses, dan Anda mungkin berada di dalam beberapa handler perkecualian yang akan menangkap
SystemExit
, ada fungsi lain -os._exit
- yang berakhir segera pada level C dan tidak melakukan salah satu dari penghancuran normal. dari penerjemah; misalnya, kait yang terdaftar dengan modul "atexit" tidak dieksekusi.sumber
Saya baru tahu bahwa ketika menulis aplikasi multithreadded,
raise SystemExit
dansys.exit()
keduanya hanya membunuh thread yang sedang berjalan. Di sisi lain,os._exit()
keluar dari seluruh proses. Ini telah dibahas dalam " Mengapa sys.exit () tidak keluar ketika dipanggil di dalam utas dengan Python? ".Contoh di bawah ini memiliki 2 utas. Kenny dan Cartman. Cartman seharusnya hidup selamanya, tetapi Kenny dipanggil secara rekursif dan harus mati setelah 3 detik. (panggilan rekursif bukan cara terbaik, tapi saya punya alasan lain)
Jika kita juga ingin Cartman mati ketika Kenny meninggal, Kenny harus pergi bersama
os._exit
, jika tidak, hanya Kenny yang akan mati dan Cartman akan hidup selamanya.sumber
Sebagai parameter Anda dapat melewati kode keluar, yang akan dikembalikan ke OS. Standarnya adalah 0.
sumber
exit()
dansys.exit()
bukan hal yang sama. Jangan gunakanexit()
skripsys.exit()
Saya seorang pemula, tetapi tentunya ini lebih bersih dan lebih terkontrol
...
dari
...
Edit
Intinya adalah bahwa program berakhir dengan lancar dan damai, daripada "AKU SUDAH BERHENTI !!!!"
sumber
return
untuk mengakhiri skrip. Yangreturn
dilakukan adalah mengembalikan nilai dan aliran kontrol ke fungsi panggilan. Di sana ia melanjutkan dengan eksekusi tepat setelah panggilan fungsi yang dipanggilreturn
. Tentu saja, jika itureturn
adalah pernyataan terakhir dalam skrip Anda seperti dalam contoh Anda, maka skrip tersebut diakhiri tepat setelah dipanggil.exit
- maka pemrogram python mungkin tidak terlalu memperhatikan bau kode ini); dan terakhir, (3) kode multi-ulir (yang secara historis diabaikan oleh pythonista).Dalam Python 3.5, saya mencoba untuk memasukkan kode yang sama tanpa menggunakan modul (misalnya sys, Biopy) selain apa yang ada di dalamnya untuk menghentikan skrip dan mencetak pesan kesalahan ke pengguna saya. Inilah contoh saya:
Di kemudian hari, saya mendapati lebih mudah untuk hanya melakukan kesalahan:
sumber
Dua sen saya.
Python 3.8.1, Windows 10, 64-bit.
sys.exit()
tidak bekerja secara langsung untuk saya.Saya memiliki beberapa loop berikutnya.
Pertama saya mendeklarasikan variabel boolean, yang saya sebut
immediateExit
.Jadi, di awal kode program saya menulis:
Kemudian, mulai dari pengecualian loop paling dalam (bersarang), saya menulis:
Lalu saya langsung melanjutkan kelanjutan dari loop luar, dan sebelum hal lain dieksekusi oleh kode, saya menulis:
Bergantung pada kerumitannya, terkadang pernyataan di atas perlu diulang juga di kecuali bagian, dll.
Pesan khusus untuk debugging pribadi saya, juga, karena nomornya untuk tujuan yang sama - untuk melihat di mana script benar-benar keluar.
Dalam kasus khusus saya, saya sedang memproses file CSV, yang saya tidak ingin disentuh oleh perangkat lunak, jika perangkat lunak mendeteksi itu rusak. Oleh karena itu bagi saya sangat penting untuk keluar dari seluruh skrip Python segera setelah mendeteksi kemungkinan korupsi.
Dan mengikuti sys.exit bertahap dari semua loop saya berhasil melakukannya.
Kode lengkap: (beberapa perubahan diperlukan karena ini adalah kode kepemilikan untuk tugas internal):
sumber
except:
tanpa tipe pengecualian. Jika Anda hanya menggunakanexcept Exception:
(atau bahkan tipe pengecualian yang lebih terperinci jika memungkinkan), itusys.exit()
akan berfungsi sebagaimana dimaksud dan Anda tidak akan membutuhkan ini.sys.exit()
benar-benar semacam solusi terakhir untuk kesalahan kritis. Hanya dua sen saya :)