Câu trả lời:
import sys
sys.exit()
chi tiết từ sys
tài liệu mô-đun :
sys.exit([arg])
Thoát khỏi Python. Điều này được thực hiện bằng cách nâng cao
SystemExit
ngoại lệ, do đó, các hành động dọn dẹp được chỉ định bởi các mệnh đề cuối cùngtry
được tôn trọng và có thể chặn nỗ lực thoát ra ở cấp độ bên ngoài.Đối số tùy chọn arg có thể là một số nguyên cho trạng thái thoát (mặc định là 0) hoặc một loại đối tượng khác. Nếu nó là một số nguyên, số 0 được coi là chấm dứt thành công và bất kỳ giá trị khác nào được coi là chấm dứt bất thường bởi các vỏ và tương tự. Hầu hết các hệ thống yêu cầu nó phải nằm trong phạm vi 0-127 và tạo ra kết quả không xác định theo cách khác. Một số hệ thống có một quy ước để gán ý nghĩa cụ thể cho các mã thoát cụ thể, nhưng chúng thường không được phát triển; Các chương trình Unix thường sử dụng 2 cho các lỗi cú pháp dòng lệnh và 1 cho tất cả các loại lỗi khác. Nếu một loại đối tượng khác được thông qua, Không có gì tương đương với việc chuyển số 0 và bất kỳ đối tượng nào khác được in tới
stderr
và dẫn đến mã thoát là 1. Đặc biệt,sys.exit("some error message")
là một cách nhanh chóng để thoát khỏi chương trình khi xảy ra lỗi.Vì
exit()
cuối cùng, chỉ có duy nhất một tên lửa làm tăng một ngoại lệ, nó sẽ chỉ thoát khỏi quá trình khi được gọi từ luồng chính và ngoại lệ không bị chặn.
Lưu ý rằng đây là cách 'tốt đẹp' để thoát. @ glyphtwistedmatrix bên dưới chỉ ra rằng nếu bạn muốn có một 'lối thoát cứng', bạn có thể sử dụng os._exit(*errorcode*)
, mặc dù nó có thể đặc biệt là os ở một mức độ nào đó (ví dụ: nó có thể không có mã lỗi dưới cửa sổ), và nó chắc chắn là ít thân thiện hơn vì nó không để người phiên dịch thực hiện bất kỳ việc dọn dẹp nào trước khi quá trình chết.
sys.exit()
làm tăng một SystemExit
ngoại lệ trong chuỗi hiện tại.
UserWarning: To exit: use 'exit', 'quit', or Ctrl-D. warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)
Một cách đơn giản để sớm chấm dứt tập lệnh Python là sử dụng hàm dựng sẵn quit()
. Không cần nhập bất kỳ thư viện nào, và nó hiệu quả và đơn giản.
Thí dụ:
#do stuff
if this == that:
quit()
Một cách khác là:
raise SystemExit
sys.exit
trình bao bọc thích hợp hơn (và có thể ghi đè)
Bạn cũng có thể sử dụng đơn giản exit()
.
Hãy ghi nhớ rằng sys.exit()
, exit()
, quit()
, và os._exit(0)
giết người phiên dịch Python. Do đó, nếu nó xuất hiện trong một tập lệnh được gọi từ một tập lệnh khác execfile()
, nó sẽ dừng thực thi cả hai tập lệnh.
Xem " Dừng thực thi tập lệnh được gọi bằng execfile " để tránh điều này.
Mặc dù bạn thường thích sys.exit
vì nó "thân thiện" hơn với mã khác, nhưng tất cả những gì nó thực sự làm là một ngoại lệ.
Nếu bạn chắc chắn rằng bạn cần phải thoát khỏi một quy trình ngay lập tức và bạn có thể đang ở trong một trình xử lý ngoại lệ nào đó sẽ bắt SystemExit
, có một chức năng khác - os._exit
- kết thúc ngay lập tức ở cấp độ C và không thực hiện bất kỳ thao tác xé thông thường nào của người phiên dịch; ví dụ, các hook được đăng ký với mô-đun "atexit" không được thực thi.
Tôi mới phát hiện ra rằng khi viết một ứng dụng đa luồng raise SystemExit
và sys.exit()
cả hai chỉ giết chết chuỗi đang chạy. Mặt khác, os._exit()
thoát khỏi toàn bộ quá trình. Điều này đã được thảo luận trong " Tại sao sys.exit () không thoát khi được gọi bên trong một luồng trong Python? ".
Ví dụ dưới đây có 2 chủ đề. Kenny và Cartman. Cartman được cho là sẽ sống mãi mãi, nhưng Kenny được gọi là đệ quy và sẽ chết sau 3 giây. (gọi đệ quy không phải là cách tốt nhất, nhưng tôi có lý do khác)
Nếu chúng ta cũng muốn Cartman chết khi Kenny chết, Kenny nên đi cùng os._exit
, nếu không, chỉ có Kenny sẽ chết và Cartman sẽ sống mãi mãi.
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()
Là một tham số, bạn có thể truyền mã thoát, mã này sẽ được trả về HĐH. Mặc định là 0.
exit()
và sys.exit()
không phải là điều tương tự. Đừng sử dụng các exit()
tập lệnh tích hợp sẵn, đây chỉ là một trợ giúp cho trình vỏ tương tác - sử dụngsys.exit()
Tôi là một người mới hoàn toàn nhưng chắc chắn điều này sạch sẽ hơn và được kiểm soát nhiều hơn
def main():
try:
Answer = 1/0
print Answer
except:
print 'Program terminated'
return
print 'You wont see this'
if __name__ == '__main__':
main()
...
Chương trình chấm dứt
hơn
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()
...
Chương trình đã kết thúc TracBack (cuộc gọi gần đây nhất vừa qua): Tệp "Z: \ Directory \ testdieprogram.py", dòng 12, trong tệp chính () "Z: \ Directory \ testdieprogram.py", dòng 8, trong sys.exit chính ( ) SystemExit
Biên tập
Vấn đề là chương trình kết thúc suôn sẻ và hòa bình, thay vì "TÔI ĐÃ DỪNG LẠI !!!!"
return
để chấm dứt tập lệnh. Tất cả những return
gì đang làm là trả về một giá trị và một luồng điều khiển cho chức năng gọi. Ở đó, nó tiếp tục với việc thực thi ngay sau lệnh gọi của hàm được gọi return
. Tất nhiên, nếu return
câu lệnh cuối cùng trong tập lệnh của bạn như trong ví dụ của bạn, thì tập lệnh bị chấm dứt ngay sau khi nó được gọi.
exit
- do đó các lập trình viên python có thể không nhận thấy mùi hôi thối của mã này nhiều như vậy); và cuối cùng, (3) mã đa luồng (mà pythonistas trong lịch sử chỉ bỏ qua).
Trong Python 3.5, tôi đã cố gắng kết hợp mã tương tự mà không sử dụng các mô-đun (ví dụ: sys, Biopy) ngoài những gì được tích hợp để dừng tập lệnh và in thông báo lỗi cho người dùng của tôi. Đây là ví dụ của tôi:
## 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
Sau đó, tôi thấy thật ngắn gọn hơn khi chỉ đưa ra một lỗi:
## My example revised:
if "ATG" in my_DNA:
## <Do something & proceed...>
else:
raise ValueError("Start codon is missing! Check your DNA sequence!")
Theo quan điểm của tôi.
Python 3.8.1, Windows 10, 64 bit.
sys.exit()
không làm việc trực tiếp với tôi.
Tôi có một số vòng lặp tiếp theo.
Đầu tiên tôi khai báo một biến boolean, mà tôi gọi immediateExit
.
Vì vậy, vào đầu mã chương trình tôi viết:
immediateExit = False
Sau đó, bắt đầu từ ngoại lệ vòng lặp bên trong (lồng nhau) nhất, tôi viết:
immediateExit = True
sys.exit('CSV file corrupted 0.')
Sau đó, tôi đi vào sự tiếp tục ngay lập tức của vòng lặp bên ngoài và trước khi bất kỳ điều gì khác được thực thi bởi mã, tôi viết:
if immediateExit:
sys.exit('CSV file corrupted 1.')
Tùy thuộc vào độ phức tạp, đôi khi câu lệnh trên cũng cần được lặp lại trong các phần ngoại trừ, v.v.
if immediateExit:
sys.exit('CSV file corrupted 1.5.')
Thông điệp tùy chỉnh là để gỡ lỗi cá nhân của tôi, cũng như các con số có cùng mục đích - để xem kịch bản thực sự thoát ra.
'CSV file corrupted 1.5.'
Trong trường hợp cụ thể của tôi, tôi đang xử lý tệp CSV mà tôi không muốn phần mềm chạm vào, nếu phần mềm phát hiện ra nó bị hỏng. Do đó, đối với tôi, việc thoát toàn bộ tập lệnh Python ngay lập tức sau khi phát hiện tham nhũng có thể là rất quan trọng.
Và theo sys.exit-ing dần dần từ tất cả các vòng tôi quản lý để làm điều đó.
Mã đầy đủ: (một số thay đổi là cần thiết vì đó là mã sở hữu cho các tác vụ nội bộ):
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:
mà không có loại ngoại lệ. Nếu bạn chỉ sử dụng except Exception:
(hoặc thậm chí là một loại ngoại lệ chi tiết hơn nếu có thể), thì sys.exit()
nó sẽ hoạt động như dự định và bạn sẽ không cần đến công việc này.
sys.exit()
thực sự là một loại giải pháp cuối cùng cho các lỗi nghiêm trọng. Chỉ hai xu của tôi :)
sys.exit()
không hoạt động (không giết quá trình, chỉ giết chết luồng) nếu được nâng lên bởi một luồng nền?