Jawaban:
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()
memunculkan SystemExit
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:
#do stuff
if this == that:
quit()
Cara lain adalah:
raise SystemExit
sys.exit
Anda juga bisa menggunakannya secara sederhana exit()
.
Perlu diingat bahwa sys.exit()
, exit()
, quit()
, dan os._exit(0)
membunuh interpreter Python. Oleh karena itu, jika muncul dalam skrip yang dipanggil dari skrip lain oleh execfile()
, itu menghentikan eksekusi kedua skrip.
Lihat " Hentikan eksekusi skrip yang dipanggil dengan execfile " untuk menghindari ini.
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.
Saya baru tahu bahwa ketika menulis aplikasi multithreadded, raise SystemExit
dan sys.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.
import threading
import time
import sys
import os
def kenny(num=0):
if num > 3:
# print("Kenny dies now...")
# raise SystemExit #Kenny will die, but Cartman will live forever
# sys.exit(1) #Same as above
print("Kenny dies and also kills Cartman!")
os._exit(1)
while True:
print("Kenny lives: {0}".format(num))
time.sleep(1)
num += 1
kenny(num)
def cartman():
i = 0
while True:
print("Cartman lives: {0}".format(i))
i += 1
time.sleep(1)
if __name__ == '__main__':
daemon_kenny = threading.Thread(name='kenny', target=kenny)
daemon_cartman = threading.Thread(name='cartman', target=cartman)
daemon_kenny.setDaemon(True)
daemon_cartman.setDaemon(True)
daemon_kenny.start()
daemon_cartman.start()
daemon_kenny.join()
daemon_cartman.join()
from sys import exit
exit()
Sebagai parameter Anda dapat melewati kode keluar, yang akan dikembalikan ke OS. Standarnya adalah 0.
exit()
dan sys.exit()
bukan hal yang sama. Jangan gunakan exit()
skrip sys.exit()
Saya seorang pemula, tetapi tentunya ini lebih bersih dan lebih terkontrol
def main():
try:
Answer = 1/0
print Answer
except:
print 'Program terminated'
return
print 'You wont see this'
if __name__ == '__main__':
main()
...
Program dihentikan
dari
import sys
def main():
try:
Answer = 1/0
print Answer
except:
print 'Program terminated'
sys.exit()
print 'You wont see this'
if __name__ == '__main__':
main()
...
Program menghentikan Traceback (panggilan terakhir terakhir): File "Z: \ Directory \ testdieprogram.py", baris 12, di main () File "Z: \ Directory \ testdieprogram.py", baris 8, di sys.exit utama ( ) SystemExit
Edit
Intinya adalah bahwa program berakhir dengan lancar dan damai, daripada "AKU SUDAH BERHENTI !!!!"
return
untuk mengakhiri skrip. Yang return
dilakukan adalah mengembalikan nilai dan aliran kontrol ke fungsi panggilan. Di sana ia melanjutkan dengan eksekusi tepat setelah panggilan fungsi yang dipanggil return
. Tentu saja, jika itu return
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:
## My example:
if "ATG" in my_DNA:
## <Do something & proceed...>
else:
print("Start codon is missing! Check your DNA sequence!")
exit() ## as most folks said above
Di kemudian hari, saya mendapati lebih mudah untuk hanya melakukan kesalahan:
## My example revised:
if "ATG" in my_DNA:
## <Do something & proceed...>
else:
raise ValueError("Start codon is missing! Check your DNA sequence!")
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:
immediateExit = False
Kemudian, mulai dari pengecualian loop paling dalam (bersarang), saya menulis:
immediateExit = True
sys.exit('CSV file corrupted 0.')
Lalu saya langsung melanjutkan kelanjutan dari loop luar, dan sebelum hal lain dieksekusi oleh kode, saya menulis:
if immediateExit:
sys.exit('CSV file corrupted 1.')
Bergantung pada kerumitannya, terkadang pernyataan di atas perlu diulang juga di kecuali bagian, dll.
if immediateExit:
sys.exit('CSV file corrupted 1.5.')
Pesan khusus untuk debugging pribadi saya, juga, karena nomornya untuk tujuan yang sama - untuk melihat di mana script benar-benar keluar.
'CSV file corrupted 1.5.'
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):
immediateExit = False
start_date = '1994.01.01'
end_date = '1994.01.04'
resumedDate = end_date
end_date_in_working_days = False
while not end_date_in_working_days:
try:
end_day_position = working_days.index(end_date)
end_date_in_working_days = True
except ValueError: # try statement from end_date in workdays check
print(current_date_and_time())
end_date = input('>> {} is not in the list of working days. Change the date (YYYY.MM.DD): '.format(end_date))
print('New end date: ', end_date, '\n')
continue
csv_filename = 'test.csv'
csv_headers = 'date,rate,brand\n' # not real headers, this is just for example
try:
with open(csv_filename, 'r') as file:
print('***\nOld file {} found. Resuming the file by re-processing the last date lines.\nThey shall be deleted and re-processed.\n***\n'.format(csv_filename))
last_line = file.readlines()[-1]
start_date = last_line.split(',')[0] # assigning the start date to be the last like date.
resumedDate = start_date
if last_line == csv_headers:
pass
elif start_date not in working_days:
print('***\n\n{} file might be corrupted. Erase or edit the file to continue.\n***'.format(csv_filename))
immediateExit = True
sys.exit('CSV file corrupted 0.')
else:
start_date = last_line.split(',')[0] # assigning the start date to be the last like date.
print('\nLast date:', start_date)
file.seek(0) # setting the cursor at the beginnning of the file
lines = file.readlines() # reading the file contents into a list
count = 0 # nr. of lines with last date
for line in lines: #cycling through the lines of the file
if line.split(',')[0] == start_date: # cycle for counting the lines with last date in it.
count = count + 1
if immediateExit:
sys.exit('CSV file corrupted 1.')
for iter in range(count): # removing the lines with last date
lines.pop()
print('\n{} lines removed from date: {} in {} file'.format(count, start_date, csv_filename))
if immediateExit:
sys.exit('CSV file corrupted 1.2.')
with open(csv_filename, 'w') as file:
print('\nFile', csv_filename, 'open for writing')
file.writelines(lines)
print('\nRemoving', count, 'lines from', csv_filename)
fileExists = True
except:
if immediateExit:
sys.exit('CSV file corrupted 1.5.')
with open(csv_filename, 'w') as file:
file.write(csv_headers)
fileExists = False
if immediateExit:
sys.exit('CSV file corrupted 2.')
except:
tanpa tipe pengecualian. Jika Anda hanya menggunakan except Exception:
(atau bahkan tipe pengecualian yang lebih terperinci jika memungkinkan), itu sys.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 :)
sys.exit()
tidak bekerja (tidak membunuh proses, hanya membunuh utas) jika dimunculkan oleh utas latar?