जवाबों:
import sys
sys.exit()
से विवरण sys
मॉड्यूल प्रलेखन :
sys.exit([arg])
पायथन से बाहर निकलें। यह
SystemExit
अपवाद बढ़ाकर लागू किया गया है, इसलिएtry
बयानों के अंत में निर्दिष्ट क्लीनअप क्रियाओं को सम्मानित किया जाता है, और बाहरी स्तर पर निकास प्रयास को रोकना संभव है।वैकल्पिक तर्क arg बाहर निकलने की स्थिति (शून्य में डिफ़ॉल्ट), या किसी अन्य प्रकार की वस्तु देने वाला पूर्णांक हो सकता है। यदि यह पूर्णांक है, तो शून्य को "सफल समाप्ति" माना जाता है और किसी भी गैर-मान को शेल और इस तरह से "असामान्य समाप्ति" माना जाता है। अधिकांश प्रणालियों को इसे 0-127 की सीमा में रखने की आवश्यकता होती है, और अन्यथा अपरिभाषित परिणाम उत्पन्न करते हैं। कुछ प्रणालियों में विशिष्ट निकास कोड के लिए विशिष्ट अर्थ निर्दिष्ट करने के लिए एक सम्मेलन होता है, लेकिन ये आमतौर पर अविकसित होते हैं; यूनिक्स प्रोग्राम आम तौर पर कमांड लाइन सिंटैक्स त्रुटियों के लिए 2 और अन्य सभी प्रकार की त्रुटियों के लिए 1 का उपयोग करते हैं। यदि किसी अन्य प्रकार की वस्तु पास की जाती है, तो कोई भी शून्य पास करने के बराबर नहीं है, और किसी भी अन्य वस्तु को प्रिंट किया जाता है
stderr
और परिणाम 1 से बाहर निकलता है।sys.exit("some error message")
जब कोई त्रुटि होती है तो प्रोग्राम से बाहर निकलने का एक त्वरित तरीका है।चूँकि
exit()
अंततः "केवल" एक अपवाद को उठाता है, यह केवल मुख्य थ्रेड से बुलाए जाने पर प्रक्रिया से बाहर निकल जाएगा, और अपवाद को बाधित नहीं किया गया है।
ध्यान दें कि यह बाहर निकलने का 'अच्छा' तरीका है। नीचे दिए गए @ ग्लिफ़वेटेवेट्रिक्स बताते हैं कि यदि आप 'हार्ड एग्जिट' चाहते हैं, तो आप इसका उपयोग कर सकते हैं os._exit(*errorcode*)
, हालाँकि यह कुछ हद तक ओएस-विशिष्ट है (उदाहरण के लिए, यह विंडोज़ के तहत एक एररकोड नहीं ले सकता है), और यह निश्चित रूप से कम अनुकूल है क्योंकि मरने से पहले दुभाषिया को कोई सफाई नहीं करने देता।
sys.exit()
एक SystemExit
अपवाद उठाता है ।
UserWarning: To exit: use 'exit', 'quit', or Ctrl-D. warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)
पायथन लिपि को जल्दी समाप्त करने का एक सरल तरीका बिल्ट-इन quit()
फ़ंक्शन का उपयोग करना है। किसी भी पुस्तकालय को आयात करने की आवश्यकता नहीं है, और यह कुशल और सरल है।
उदाहरण:
#do stuff
if this == that:
quit()
एक और तरीका है:
raise SystemExit
sys.exit
आवरण के बजाय सीधे एक अंतर्निहित अपवाद को बढ़ा रहे हैं
तुम भी बस का उपयोग कर सकते हैं exit()
।
ध्यान रखें कि sys.exit()
, exit()
, quit()
, और os._exit(0)
मारने अजगर दुभाषिया। इसलिए, यदि यह किसी अन्य स्क्रिप्ट से बुलाए गए स्क्रिप्ट में दिखाई देता है, तो यह execfile()
दोनों स्क्रिप्ट के निष्पादन को रोक देता है।
इससे बचने के लिए " निष्पादित के साथ बुलाया स्क्रिप्ट का निष्पादन रोकें " देखें ।
जबकि आपको आम तौर पर पसंद करना चाहिए sys.exit
क्योंकि यह अन्य कोड के लिए अधिक "मैत्रीपूर्ण" है, यह वास्तव में एक अपवाद को बढ़ाता है।
यदि आप सुनिश्चित हैं कि आपको तुरंत एक प्रक्रिया से बाहर निकलने की आवश्यकता है, और आप कुछ अपवाद हैंडलर के अंदर हो सकते हैं जो कि पकड़ लेगा SystemExit
, तो एक और कार्य है - os._exit
- जो सी स्तर पर तुरंत समाप्त हो जाता है और किसी भी सामान्य आंसू को नीचे नहीं करता है। दुभाषिया का; उदाहरण के लिए, "एटेक्सिट" मॉड्यूल के साथ पंजीकृत हुक निष्पादित नहीं किए जाते हैं।
मुझे पता चला है कि जब एक मल्टीथ्रेडेड ऐप लिखते हैं, raise SystemExit
और sys.exit()
दोनों केवल रनिंग थ्रेड को मारते हैं। दूसरी ओर, os._exit()
पूरी प्रक्रिया से बाहर निकलता है। इस पर चर्चा की गई थी " पायथन में एक थ्रेड के अंदर बुलाया जाने पर sys.exit () बाहर क्यों नहीं निकलता है? "।
नीचे दिए गए उदाहरण में 2 धागे हैं। केनी और कार्टमैन। कार्टमैन हमेशा के लिए रहने वाला है, लेकिन केनी को पुनरावर्ती कहा जाता है और 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, मुख्य में () फ़ाइल "Z: \ Directory \ testdieprogram.py", पंक्ति 8, मुख्य sys.exit ( ) SystemExit
संपादित करें
यह कहा जा रहा है कि यह कार्यक्रम "I’mVE STOPPED !!!!" की बजाय सुचारू रूप से और शांतिपूर्वक संपन्न होता है ।
return
स्क्रिप्ट को समाप्त करने के लिए उपयोग कर सकते हैं । सभी return
कर रहा है और कॉलिंग फ़ंक्शन के लिए एक मूल्य और नियंत्रण का प्रवाह लौटा रहा है। यह फ़ंक्शन के कॉल के ठीक बाद निष्पादन के साथ जारी रहता है जिसे कॉल किया जाता है return
। बेशक, यदि return
आपके उदाहरण के रूप में आपकी स्क्रिप्ट में अंतिम कथन है, तो स्क्रिप्ट को सही कहा जाने के बाद समाप्त कर दिया जाता है।
exit
- इसलिए अजगर प्रोग्रामर इस कोड की बदबू को अधिक नहीं नोटिस कर सकते हैं); और अंत में, (3) बहु-थ्रेडेड कोड (जिसे पाइथोनिस्टस ने ऐतिहासिक रूप से सिर्फ अनदेखा किया है)।
पायथन 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!")
मेरे दो सेंट।
पायथन 3.8.1, विंडोज 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 फ़ाइल संसाधित कर रहा हूं, जो मैं नहीं चाहता कि सॉफ़्टवेयर को स्पर्श किया जाए, यदि सॉफ़्टवेयर यह पता लगाता है कि यह दूषित है। इसलिए मेरे लिए संभावित भ्रष्टाचार का पता लगाने के तुरंत बाद पूरी पायथन लिपि से बाहर निकलना बहुत जरूरी है।
और क्रमिक 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()
काम नहीं करता है (प्रक्रिया को नहीं मारता है, बस धागे को मारता है) यदि पृष्ठभूमि थ्रेड द्वारा उठाया जाता है?