ฉันตระหนักถึงdie()
คำสั่งใน PHP ซึ่งออกจากสคริปต์ก่อน
ฉันจะทำสิ่งนี้ใน Python ได้อย่างไร
ฉันตระหนักถึงdie()
คำสั่งใน PHP ซึ่งออกจากสคริปต์ก่อน
ฉันจะทำสิ่งนี้ใน Python ได้อย่างไร
คำตอบ:
import sys
sys.exit()
รายละเอียดจากsys
เอกสารประกอบของโมดูล :
sys.exit([arg])
ออกจาก Python สิ่งนี้ถูกนำไปใช้โดยการเพิ่ม
SystemExit
ข้อยกเว้นดังนั้นการดำเนินการล้างข้อมูลที่ระบุไว้ในส่วนสุดท้ายของtry
คำสั่งจะได้รับการยอมรับและเป็นไปได้ที่จะสกัดกั้นความพยายามออกในระดับนอกอาร์กิวเมนต์เผื่อเลือกสามารถเป็นจำนวนเต็มที่ให้สถานะการออก (ค่าเริ่มต้นเป็นศูนย์) หรือวัตถุชนิดอื่น ถ้ามันเป็นจำนวนเต็มศูนย์จะถือว่า“ การยุติที่ประสบความสำเร็จ” และค่าที่ไม่ใช่ศูนย์ใด ๆ จะถือว่าเป็น“ การยุติที่ผิดปกติ” โดยเชลล์และสิ่งที่คล้ายกัน ระบบส่วนใหญ่ต้องการให้อยู่ในช่วง 0-127 และให้ผลลัพธ์ที่ไม่ได้กำหนดไว้เป็นอย่างอื่น ระบบบางระบบมีระเบียบปฏิบัติสำหรับการกำหนดความหมายเฉพาะให้กับรหัสการออกที่เฉพาะเจาะจง แต่โดยทั่วไปจะมีการด้อยพัฒนา โดยทั่วไปแล้วโปรแกรม Unix จะใช้ 2 สำหรับข้อผิดพลาดทางไวยากรณ์บรรทัดคำสั่งและ 1 สำหรับข้อผิดพลาดชนิดอื่นทั้งหมด หากวัตถุชนิดอื่นถูกส่งผ่านไม่มีจะเทียบเท่ากับการผ่านศูนย์และวัตถุอื่น ๆ จะถูกพิมพ์ไป
stderr
และผลลัพธ์ในรหัสทางออก 1 โดยเฉพาะอย่างยิ่งsys.exit("some error message")
เป็นวิธีที่รวดเร็วในการออกจากโปรแกรมเมื่อเกิดข้อผิดพลาดเนื่องจาก
exit()
ท้ายที่สุด "เท่านั้น" ทำให้เกิดข้อยกเว้นมันจะออกจากกระบวนการเมื่อถูกเรียกจากเธรดหลักเท่านั้นและข้อยกเว้นจะไม่ถูกดักจับ
โปรดทราบว่านี่เป็นวิธีที่ดีในการออก @ glyphtwistedmatrixด้านล่างชี้ให้เห็นว่าหากคุณต้องการ 'hard exit' คุณสามารถใช้งานos._exit(*errorcode*)
ได้แม้ว่ามันจะเป็นระบบปฏิบัติการที่เฉพาะเจาะจงในระดับหนึ่ง (เช่นอาจไม่ใช้รหัสข้อผิดพลาดใต้ windows) และแน่นอนว่ามันไม่เป็นมิตรกับมันเลย อย่าให้ล่ามทำการล้างข้อมูลใด ๆ ก่อนที่กระบวนการจะตาย
sys.exit()
ยกSystemExit
ข้อยกเว้นในเธรดปัจจุบัน
UserWarning: To exit: use 'exit', 'quit', or Ctrl-D. warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)
วิธีง่ายๆในการยกเลิกสคริปต์ Python ก่อนหน้านี้คือการใช้quit()
ฟังก์ชันในตัว ไม่จำเป็นต้องนำเข้าห้องสมุดใด ๆ และมีประสิทธิภาพและง่าย
ตัวอย่าง:
#do stuff
if this == that:
quit()
อีกวิธีคือ:
raise SystemExit
sys.exit
กระดาษห่อ(และเขียนทับได้) ที่ดีกว่า
exit()
นอกจากนี้คุณยังสามารถใช้เพียงแค่
โปรดทราบว่าsys.exit()
, exit()
, quit()
และos._exit(0)
ฆ่าล่ามหลาม ดังนั้นหากปรากฏในสคริปต์ที่เรียกจากสคริปต์อื่นโดยexecfile()
จะหยุดการทำงานของสคริปต์ทั้งสอง
โปรดดู " หยุดการเรียกใช้สคริปต์ที่เรียกใช้ด้วย execfile " เพื่อหลีกเลี่ยงปัญหานี้
แม้ว่าโดยทั่วไปแล้วคุณควรจะชอบsys.exit
เพราะมันเป็น "มิตร" กับรหัสอื่น ๆ ทั้งหมดที่จริง ๆ แล้วก็คือการยกข้อยกเว้น
หากคุณแน่ใจว่าคุณต้องออกจากกระบวนการทันทีและคุณอาจอยู่ในตัวจัดการข้อยกเว้นบางอย่างที่จะตรวจจับSystemExit
มีฟังก์ชันอื่นos._exit
- ซึ่งจะยกเลิกทันทีที่ระดับ C และไม่ดำเนินการตามปกติใด ๆ ของล่าม; ตัวอย่างเช่น hooks ลงทะเบียนกับโมดูล "atexit" จะไม่ถูกดำเนินการ
ฉันเพิ่งค้นพบว่าเมื่อเขียนแอพแบบมัลติเธรดraise SystemExit
และsys.exit()
ทั้งคู่ก็ฆ่าเฉพาะเธรดที่กำลังรันอยู่ ในอีกทางหนึ่งให้os._exit()
ออกจากกระบวนการทั้งหมด สิ่งนี้ถูกกล่าวถึงใน " ทำไม sys.exit () ไม่ออกเมื่อเรียกภายในเธรดใน Python "
ตัวอย่างด้านล่างมี 2 เธรด Kenny และ Cartman คาร์ทควรจะมีชีวิตอยู่ตลอดไป แต่เคนนี่ถูกเรียกซ้ำและควรตายหลังจาก 3 วินาที (การโทรซ้ำไม่ใช่วิธีที่ดีที่สุด แต่ฉันมีเหตุผลอื่น)
ถ้าเราต้องการให้คาร์ทตายเมื่อเคนนี่เสียชีวิตเคนนีควรจะไปด้วยos._exit
มิฉะนั้นเคนนี่เท่านั้นที่จะตายและคาร์ทจะมีชีวิตอยู่ตลอดไป
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()
ในฐานะที่เป็นพารามิเตอร์คุณสามารถส่งรหัสออกซึ่งจะกลับไปที่ระบบปฏิบัติการ ค่าเริ่มต้นคือ 0
exit()
และsys.exit()
ไม่เหมือนกัน อย่าใช้exit()
สคริปต์ในตัวนี่เป็นเพียงตัวช่วยสำหรับเชลล์แบบโต้ตอบ - การใช้งานsys.exit()
ฉันเป็นมือใหม่ทั้งหมด แต่แน่นอนว่ามันสะอาดและควบคุมได้มากกว่า
def main():
try:
Answer = 1/0
print Answer
except:
print 'Program terminated'
return
print 'You wont see this'
if __name__ == '__main__':
main()
...
โปรแกรมถูกยกเลิก
กว่า
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()
...
โปรแกรมสิ้นสุดการสืบค้นกลับ (การโทรล่าสุด): ไฟล์ "Z: \ Directory \ testdieprogram.py", บรรทัดที่ 12, ใน main () ไฟล์ "Z: \ Directory \ testdieprogram.py", บรรทัดที่ 8 ใน main sys.exit ( ) SystemExit
แก้ไข
ประเด็นที่โปรแกรมจบลงอย่างราบรื่นและสงบสุขมากกว่า"ฉันหยุดแล้ว !!!!"
return
เพื่อยุติสคริปต์ ทั้งหมดที่return
ทำคือคืนค่าและลำดับการควบคุมไปยังฟังก์ชันการโทร ที่นั่นจะมีการดำเนินการทันทีหลังจากการเรียกใช้ฟังก์ชันที่เรียกreturn
ใช้ แน่นอนถ้าreturn
คำสั่งสุดท้ายในสคริปต์ของคุณเป็นในตัวอย่างของคุณแล้วสคริปต์จะถูกยกเลิกทันทีหลังจากที่มันถูกเรียก
exit
ดังนั้นโปรแกรมเมอร์ของ Python อาจไม่สังเกตเห็นกลิ่นเหม็นของรหัสนี้มาก); และสุดท้าย (3) โค้ดแบบมัลติเธรด (ซึ่ง pythonistas นั้นไม่สนใจในอดีต)
ใน Python 3.5 ฉันพยายามรวมโค้ดที่คล้ายกันโดยไม่ใช้โมดูล (เช่น sys, Biopy) นอกเหนือจากที่มีในตัวเพื่อหยุดสคริปต์และพิมพ์ข้อความแสดงข้อผิดพลาดแก่ผู้ใช้ของฉัน นี่คือตัวอย่างของฉัน:
## 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
ต่อมาฉันพบว่ามันง่ายกว่าที่จะโยนข้อผิดพลาด:
## My example revised:
if "ATG" in my_DNA:
## <Do something & proceed...>
else:
raise ValueError("Start codon is missing! Check your DNA sequence!")
สองเซ็นต์ของฉัน
Python 3.8.1, Windows 10, 64 บิต
sys.exit()
ไม่ทำงานสำหรับฉันโดยตรง
ฉันมีลูปต่อไปหลายอัน
immediateExit
ครั้งแรกที่ฉันประกาศตัวแปรบูลซึ่งผมเรียกว่า
ดังนั้นในตอนต้นของรหัสโปรแกรมฉันเขียน:
immediateExit = False
จากนั้นเริ่มจากข้อยกเว้นลูปภายใน (ซ้อนกัน) ฉันเขียน:
immediateExit = True
sys.exit('CSV file corrupted 0.')
จากนั้นฉันก็เข้าสู่การวนรอบนอกอย่างทันทีทันใดและก่อนที่สิ่งอื่นใดที่ถูกประหารโดยรหัสฉันเขียน:
if immediateExit:
sys.exit('CSV file corrupted 1.')
ขึ้นอยู่กับความซับซ้อนบางครั้งคำสั่งข้างต้นจะต้องทำซ้ำในส่วนยกเว้น ฯลฯ
if immediateExit:
sys.exit('CSV file corrupted 1.5.')
ข้อความที่กำหนดเองมีไว้สำหรับการแก้ไขข้อบกพร่องส่วนบุคคลของฉันเช่นเดียวกับตัวเลขที่มีวัตถุประสงค์เดียวกัน - เพื่อดูว่าสคริปต์ออกจากที่ใด
'CSV file corrupted 1.5.'
ในกรณีเฉพาะของฉันฉันกำลังประมวลผลไฟล์ CSV ซึ่งฉันไม่ต้องการให้ซอฟต์แวร์สัมผัสหากซอฟต์แวร์ตรวจพบว่าซอฟต์แวร์เสียหาย ดังนั้นสำหรับฉันมันสำคัญมากที่จะออกจากสคริปต์ Python ทั้งหมดทันทีหลังจากตรวจพบความเสียหายที่อาจเกิดขึ้น
และติดตาม sys.exit-ing อย่างค่อยเป็นค่อยไปจากลูปทั้งหมดที่ฉันจัดการให้ทำ
รหัสเต็ม: (จำเป็นต้องทำการเปลี่ยนแปลงบางอย่างเนื่องจากเป็นรหัสที่เป็นกรรมสิทธิ์สำหรับงานภายใน):
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:
โดยไม่มีประเภทยกเว้น หากคุณเพียงแค่ใช้except Exception:
(หรือแม้กระทั่งประเภทข้อยกเว้นที่ละเอียดมากขึ้นถ้าเป็นไปได้) สิ่งนี้sys.exit()
จะทำงานได้ตามที่ตั้งใจและคุณไม่จำเป็นต้องแก้ไขปัญหานี้
sys.exit()
เป็นวิธีแก้ปัญหาสุดท้ายสำหรับข้อผิดพลาดร้ายแรง แค่สองเซ็นต์ของฉัน :)
sys.exit()
ใช้งานไม่ได้ (ไม่ฆ่ากระบวนการเพียงฆ่าเธรด) หากยกมาโดยเธรดพื้นหลัง