पायथन में निकास () और sys.exit () के बीच अंतर


409

पायथन में, दो समान नाम वाले कार्य हैं, exit()और sys.exit()। क्या अंतर है और मुझे एक दूसरे पर कब इस्तेमाल करना चाहिए?

जवाबों:


471

exitइंटरैक्टिव शेल के लिए एक सहायक है - sys.exitकार्यक्रमों में उपयोग के लिए है।

siteमॉड्यूल (जो स्टार्टअप के दौरान स्वचालित रूप से आयात किया जाता है को छोड़कर अगर, -Sकमांड लाइन विकल्प दिया जाता है) में निर्मित नाम स्थान के लिए कई स्थिरांक कहते हैं (उदाहरण के लिए exit)वे इंटरैक्टिव दुभाषिया खोल लिए उपयोगी होते हैं और कार्यक्रमों में नहीं किया जाना चाहिए


तकनीकी रूप से, वे ज्यादातर ऐसा ही करते हैं: उठाते हुए SystemExitsysmodule.csys.exit में ऐसा करता है :

static PyObject *
sys_exit(PyObject *self, PyObject *args)
{
    PyObject *exit_code = 0;
    if (!PyArg_UnpackTuple(args, "exit", 0, 1, &exit_code))
        return NULL;
    /* Raise SystemExit so callers may catch it or clean up. */
    PyErr_SetObject(PyExc_SystemExit, exit_code);
   return NULL;
}

जबकि क्रमशः साइट थिंकपैड और _sitebuiltins.pyexit में परिभाषित किया गया है।

class Quitter(object):
    def __init__(self, name):
        self.name = name
    def __repr__(self):
        return 'Use %s() or %s to exit' % (self.name, eof)
    def __call__(self, code=None):
        # Shells like IDLE catch the SystemExit, but listen when their
        # stdin wrapper is closed.
        try:
            sys.stdin.close()
        except:
            pass
        raise SystemExit(code)
__builtin__.quit = Quitter('quit')
__builtin__.exit = Quitter('exit')

ध्यान दें कि एक तीसरा निकास विकल्प है, जिसका नाम os._exit है , जो सफाई संचालकों को बुलाए बिना बाहर निकलता है, stdio बफ़र, आदि (और जो सामान्य रूप से केवल बच्चे की प्रक्रिया में उपयोग किया जाना चाहिए fork()) के बाद बाहर निकलता है ।


4
मुझे संदेह है कि बाहर निकलना (मुख्य ()) एक सामान्य मुहावरा है क्योंकि लोगों को प्रोग्राम नोट में इस्तेमाल नहीं किया जाना चाहिए । यह तब तक ठीक काम करता है जब तक -Sइसका उपयोग नहीं किया जाता है। -Sनिर्दिष्ट करने के लिए भी इसके साथ काम करने का एक तरीका है from sys import *
नोबार

5
@nobar, सच है, लेकिन तब आप वास्तव में उपयोग नहीं करना चाहते हैं from module import *
मिकू

@EvgeniSergeev, मुझे यकीन नहीं है कि आप वास्तव में क्या पूछ रहे हैं? यह अपने आप में एक दिलचस्प सवाल हो सकता है।
मिकू

यह इस जवाब के लिए एक अच्छा जोड़ होगा कि यह देखने के लिए कि क्या कोई समस्या है "बयान के साथ" के भीतर तीन निकास कार्यों में से किसी का उपयोग करने के लिए।
DevPlayer

32

यदि मैं exit()किसी कोड में उपयोग करता हूं और इसे शेल में चलाता हूं , तो यह संदेश दिखाता है कि मैं प्रोग्राम को मारना चाहता हूं या नहीं। यह वाकई परेशान करने वाला है। यहाँ देखें

लेकिन sys.exit()इस मामले में बेहतर है। यह कार्यक्रम को बंद कर देता है और कोई संवाद बॉक्स नहीं बनाता है।


2
ऐसा इसलिए है क्योंकि यह इंटरेक्टिव शेल में उपयोग के लिए डिज़ाइन किया गया है। इसलिए यदि आप संवाद चाहते हैं, तो भी sys.exit()कार्यक्रमों के अंदर उपयोग किया जाना चाहिए।
theTechRobo36414519
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.