पायथन लिपि को कैसे समाप्त किया जाए


1074

मुझे die()PHP में कमांड के बारे में पता है जो एक स्क्रिप्ट को जल्दी से बाहर निकालता है।

मैं पायथन में यह कैसे कर सकता हूं?

जवाबों:


1413
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*), हालाँकि यह कुछ हद तक ओएस-विशिष्ट है (उदाहरण के लिए, यह विंडोज़ के तहत एक एररकोड नहीं ले सकता है), और यह निश्चित रूप से कम अनुकूल है क्योंकि मरने से पहले दुभाषिया को कोई सफाई नहीं करने देता।


9
संभवत: sys.exit()काम नहीं करता है (प्रक्रिया को नहीं मारता है, बस धागे को मारता है) यदि पृष्ठभूमि थ्रेड द्वारा उठाया जाता है?

@ सीज़ियम 62: हाँ, मौजूदा थ्रेड में sys.exit()एक SystemExitअपवाद उठाता है ।
दिमित्री ट्रोफिमोव

13
क्या एक स्क्रिप्ट को खत्म करने के लिए एक अपवाद के बिना एक रास्ता है? मैं पहले से ही स्क्रिप्ट से बाहर प्रासंगिक झंडे पारित कर रहा हूं, जिसमें पोपेन में स्टडआउट पाइपिंग है, इसलिए इस मामले में अपवाद हल करने की तुलना में अधिक परेशानी पैदा कर रहा है।
इलियट

4
क्यों, जब मैं इस पद्धति का उपयोग करता हूं तो मुझे निम्नलिखित चेतावनी मिलती है:UserWarning: To exit: use 'exit', 'quit', or Ctrl-D. warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)
बिल

1
अधिक जानकारी की आवश्यकता है; हो सकता है कि वह अपने सवाल का हकदार हो?
19-28 बजे pjz

348

पायथन लिपि को जल्दी समाप्त करने का एक सरल तरीका बिल्ट-इन quit()फ़ंक्शन का उपयोग करना है। किसी भी पुस्तकालय को आयात करने की आवश्यकता नहीं है, और यह कुशल और सरल है।

उदाहरण:

#do stuff
if this == that:
  quit()

86
यह भी sys.exit () सभी अजगर लिपियों को समाप्त करेगा, लेकिन छोड़ दिया () केवल उस स्क्रिप्ट को समाप्त करता है जिसने इसे जन्म दिया था।
विशालदेव

4
क्या आप जानते हैं कि यह कमांड अजगर 2 और अजगर 3 में अलग तरह से काम करता है?
डेविड सी।

1
किसी को पता है कि क्या यह पूरे दुभाषिया से बाहर निकल जाएगा, या बस स्क्रिप्ट को निष्पादित करने से रोक देगा? स्पाइसीफ़ाइकली: स्पाइडर में चल रही स्क्रिप्ट के लिए, पायथन इंटरप्रेटर इंटरएक्टिव होने के साथ, या इसे मार दिया जाएगा? स्क्रिप्ट को जारी रखने से रोकने की कोशिश करें, लेकिन इंटरप्रेटर इंटरएक्टिविटी को छोड़ दें।
डेमिस

3
मेरे लिए यह कहते हैं कि 'छोड़ दिया' परिभाषित नहीं है। मैं अजगर 3. उपयोग कर रहा हूँ
Vincenzooo

4
मैं अजगर 3.7 में हूँ और छोड़ दिया () दुभाषिया बंद कर देता है और स्क्रिप्ट बंद कर देता है।
RockAndRoleCoder

120

एक और तरीका है:

raise SystemExit

36
@ बिना: यह अधिक सुरुचिपूर्ण दिखता है, लेकिन इसकी अनुशंसा नहीं की जाती है: आप सीधे अधिमान्य (और अधिलेखित) sys.exitआवरण के बजाय सीधे एक अंतर्निहित अपवाद को बढ़ा रहे हैं
मेस्ट्रेलेयन

1
यह मेरे लिए एक सही तरीका है: बस रनिंग स्क्रिप्ट को छोड़ दें लेकिन
आईडीएल

77

तुम भी बस का उपयोग कर सकते हैं exit()

ध्यान रखें कि sys.exit(), exit(), quit(), और os._exit(0) मारने अजगर दुभाषिया। इसलिए, यदि यह किसी अन्य स्क्रिप्ट से बुलाए गए स्क्रिप्ट में दिखाई देता है, तो यह execfile()दोनों स्क्रिप्ट के निष्पादन को रोक देता है।

इससे बचने के लिए " निष्पादित के साथ बुलाया स्क्रिप्ट का निष्पादन रोकें " देखें ।


67

जबकि आपको आम तौर पर पसंद करना चाहिए sys.exitक्योंकि यह अन्य कोड के लिए अधिक "मैत्रीपूर्ण" है, यह वास्तव में एक अपवाद को बढ़ाता है।

यदि आप सुनिश्चित हैं कि आपको तुरंत एक प्रक्रिया से बाहर निकलने की आवश्यकता है, और आप कुछ अपवाद हैंडलर के अंदर हो सकते हैं जो कि पकड़ लेगा SystemExit, तो एक और कार्य है - os._exit- जो सी स्तर पर तुरंत समाप्त हो जाता है और किसी भी सामान्य आंसू को नीचे नहीं करता है। दुभाषिया का; उदाहरण के लिए, "एटेक्सिट" मॉड्यूल के साथ पंजीकृत हुक निष्पादित नहीं किए जाते हैं।


43

मुझे पता चला है कि जब एक मल्टीथ्रेडेड ऐप लिखते हैं, 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()

1
यह अप्रिय अप्रिय कॉलबैक से निपटने का एकमात्र तरीका प्रतीत होता है! (यानी बहु-थ्रेडेड विधियाँ।)
not2qubit

1
बहुत बढ़िया। अन्य उत्तरों में से कोई भी सीधे कई थ्रेड्स को संबोधित नहीं करता है, केवल स्क्रिप्ट अन्य स्क्रिप्ट्स को जन्म देती है।
अनाम

33
from sys import exit
exit()

एक पैरामीटर के रूप में आप एक एक्जिट कोड पास कर सकते हैं, जो ओएस पर वापस आ जाएगा। डिफ़ॉल्ट 0 है।


3
मेरे मामले में मुझे बाहर निकलने की जरूरत नहीं थी।
कोस्तनोस

4
उपरोक्त टिप्पणी पर सिर्फ पोस्टर के लिए - exit()और sys.exit()एक ही बात नहीं हैं। अंतर्निहित exit()स्क्रिप्ट का उपयोग न करें , यह इंटरैक्टिव शेल के लिए सिर्फ एक सहायक है - उपयोगsys.exit()
daveruinseverything

18

मैं कुल नौसिखिया हूं लेकिन निश्चित रूप से यह क्लीनर और अधिक नियंत्रित है

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 !!!!" की बजाय सुचारू रूप से और शांतिपूर्वक संपन्न होता है


19
एक समस्या यह होगी कि यदि आप नेस्टेड फ़ंक्शंस में हैं और आप बाहर निकलना चाहते हैं, तो आपको या तो फ्लैग को पूरे फ़ंक्शन के लिए वापस भेजना होगा या आप अगले स्तर पर वापस आ जाएंगे।
होरता

11
यह एक निरर्थक बकवास है यदि आप यह सुझाव देने की कोशिश कर रहे हैं कि आप returnस्क्रिप्ट को समाप्त करने के लिए उपयोग कर सकते हैं । सभी returnकर रहा है और कॉलिंग फ़ंक्शन के लिए एक मूल्य और नियंत्रण का प्रवाह लौटा रहा है। यह फ़ंक्शन के कॉल के ठीक बाद निष्पादन के साथ जारी रहता है जिसे कॉल किया जाता है return। बेशक, यदि returnआपके उदाहरण के रूप में आपकी स्क्रिप्ट में अंतिम कथन है, तो स्क्रिप्ट को सही कहा जाने के बाद समाप्त कर दिया जाता है।
डेविड फेरेंसी रोगोजन

1
इस दृष्टिकोण के लिए एक मजबूत तर्क दिया जाना चाहिए: (1) बीच से "बाहर निकलना" यकीनन एक "गोटो" है, इसलिए एक प्राकृतिक फैलाव है; (2) पुस्तकालयों में "बाहर निकलना" निश्चित रूप से बुरा व्यवहार है (और कुछ भी एक पुस्तकालय बन सकता है), क्योंकि एक पुस्तकालय जो "अपरिवर्तनीय" मानता है वह आमतौर पर कॉलर के लिए ठीक है । (नोट: बाहर निकलने के लिए अपवादों का उपयोग करना एक अजगर व्यावहारिक कार्य है / C / C ++ / Java देवों के लिए हमेशा अनुचित रूप से कॉल करना exit- इसलिए अजगर प्रोग्रामर इस कोड की बदबू को अधिक नहीं नोटिस कर सकते हैं); और अंत में, (3) बहु-थ्रेडेड कोड (जिसे पाइथोनिस्टस ने ऐतिहासिक रूप से सिर्फ अनदेखा किया है)।
माइकल

8

पायथन 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!")

मैं इस बात से पूरी तरह सहमत हूं कि किसी भी त्रुटि के लिए अपवाद को उठाना बेहतर है जो कि आवेदन द्वारा नियंत्रित किया जा सकता है। लेकिन सवाल यह था कि पायथन लिपि को कैसे समाप्त किया जाए, इसलिए यह वास्तव में प्रश्न का उत्तर (नया) नहीं है।
9

-1

मेरे दो सेंट।

पायथन 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.')

1
आपके योगदान के लिए धन्यवाद, लेकिन मेरे लिए इस जवाब का कोई मतलब नहीं है। चूँकि आप केवल एक पूर्ण उदाहरण के बजाय कोड के कुछ स्निपेट पोस्ट करते हैं, इसलिए यह समझना कठिन है कि आपका क्या मतलब है। केवल आपके द्वारा यहां पोस्ट की गई लाइनों की स्क्रिप्ट के साथ तुरंत स्क्रिप्ट बाहर निकल जाएगी। मैं केवल अनुमान लगा सकता हूं कि आपके पास एक ट्राइ-कैच ब्लॉक है, जो SystemExit अपवाद को पकड़ता है जो पहले से ही अन्य उत्तरों में उल्लिखित है। यदि आप अपने जवाब को पूरी तरह से काम करने के उदाहरण के साथ फिर से लिखेंगे कि कैसे आप किसी एप्लिकेशन को आसानी से बाहर कर देंगे (यानी कुछ आवश्यक शटडाउन क्रियाएं करके) मुझे लगता है कि आपकी पोस्ट एक उपयोगी अतिरिक्त हो सकती है।
वोवैनो

आपकी प्रतिक्रिया के लिए आपका धन्यवाद। अब मैंने कोड का हिस्सा जोड़ा, जो निकास कथनों की चिंता करता है।
मैथ्यू

ठीक है, यह थोड़ा और संदर्भ देता है :) हालांकि अब मुझे लगता है कि आपका समाधान वास्तव में बहुत खराब प्रोग्रामिंग पैटर्न के लिए एक काम है। सबसे पहले, आपको except:अपवाद प्रकार के बिना कभी भी उपयोग नहीं करना चाहिए । यदि आप अभी उपयोग करते हैं except Exception:(या यदि संभव हो तो और भी विस्तृत अपवाद प्रकार), तो sys.exit()इरादा के अनुसार काम करेगा और आपको इस कार्य की आवश्यकता नहीं होगी।
वोवैनो

दूसरे, ऐसा लगता है कि आप एक विधि में बहुत सी चीजें करने की कोशिश करते हैं, या शायद वैश्विक फ़ाइल दायरे में भी। यह छोटे टुकड़ों (कार्यों) में आपके कोड को तोड़ने में मदद करेगा, उदाहरण के लिए: (1) लोड इनपुट फ़ाइल, (2) प्रक्रिया डेटा, और (3) आउटपुट फ़ाइल लिखें। फिर यदि चरण 1 विफल हो जाता, तो आप चरण 2 को छोड़ देते और 3. आप लोडिंग चरण के दौरान कहीं भी अपवाद छोड़ सकते थे और आप अपवाद को एक स्थान पर संभाल सकते थे। उपयोग करना sys.exit()वास्तव में महत्वपूर्ण त्रुटियों के लिए एक प्रकार का अंतिम उपाय है। बस मेरे दो सेंट :)
wovano

सामान्य तौर पर, मैं पायथन में एक वैश्विक निकास / पड़ाव कार्यक्षमता नहीं देखता हूं, और मैं इसे इस तरह से बनाने के लिए मजबूर हूं। CSV फ़ाइल मेरे लिए वास्तव में महत्वपूर्ण है, इसलिए मैं इसे हर तरह से संभव रखता हूं, भले ही साधन बदसूरत दिखें। मैं अपनी शैली में सुधार करने के लिए द हिचकीयर गाइड टू पायथन पढ़ रहा हूं।
मैथ्यू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.