Tôi biết lệnh die()
trong PHP sẽ dừng một tập lệnh sớm.
Làm thế nào tôi có thể làm điều này trong Python?
import sys
sys.exit()
chi tiết từ tài liệu mô-đun sys
:
sys.exit([arg])
Thoát khỏi Python. Điều này được thực hiện bằng cách tăng
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ùng củatry
được tôn trọng và có thể chặn nỗ lực thoát ở 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 thành
stderr
và dẫn đến mã thoát là 1. Đặc biệt,sys.exit("some error message")
là cách nhanh chóng để thoát khỏi chương trình khi lỗi xảy ra.Vì
exit()
cuối cùng, chỉ có điều ra một ngoại lệ, nó sẽ chỉ thoát khỏi quy 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 'Đẹ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ù có thể nó đặc biệt là os ở một mức độ nào đó mã lỗi dưới windows chẳng hạn), và nó chắc chắn là ít thân thiện hơn vì nó không cho phép trình thông 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.
Một cách đơn giản để sớm chấm dứt tập lệnh Python là sử dụng hàm có sẵn (). 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
Mặc dù bạn thường thích sys.exit
hơn 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ể ở bên 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 -down của phiên dịch; ví dụ, các hook được đăng ký với mô-đun "atexit" không được thực thi.
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)
kill trình thông 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 bởi execfile()
, thì nó 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.
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.
Tôi vừa phát hiện ra rằng khi viết một ứng dụng đa luồng, cả raise SystemExit
và sys.exit()
đều 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 ở đây.
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 đệ 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 ra đi với 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 __== '__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()
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 __== '__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 __== '__main__':
main()
...
Chương trình đã kết thúc TracBack (cuộc gọi gần đây nhất) ) SystemExit
Chỉnh sửa
Vấn đề là chương trình kết thúc suôn sẻ và yên bình, thay vì "TÔI ĐÃ DỪNG LẠI !!!!"
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!");