पायथन में कोड से बाहर निकलें


207

मुझे एक संदेश मिला script xyz.py returned exit code 0। इसका क्या मतलब है?

पायथन में निकास कोड का क्या अर्थ है? कितने हैं? कौन से महत्वपूर्ण हैं?


1
आप यह संदेश कहां देख रहे हैं?
जेरेमी कैंटरेल

1
@ जेरेमी पायथनविन के तल पर।
सुदीप

जवाबों:


223

आप स्क्रिप्ट में जो देख रहे हैं वह कॉल है sys.exit()। एग्जिट कोड के रूप में उस विधि का तर्क पर्यावरण में वापस आ जाता है।

यह काफी संभावना है कि स्क्रिप्ट कभी भी निकास विधि नहीं कह रही है, और यह 0 डिफ़ॉल्ट निकास कोड है।


12
बिलकुल नहीं। यूनिक्स / लिनक्स में, मानक है: बाहर निकलने के मामले में 0 सब कुछ ठीक था। एक कमांड टाइप करें, फिर $ गूंजें ?: यदि आप 0 पढ़ते हैं, तो यह बिना किसी त्रुटि के वापस आ गया। विचार मानक परीक्षणों का है। यदि कोड xyz.py को कोई त्रुटि नहीं हुई, तो उसे 0 वापस करना होगा!
ब्रूनो वॉन पेरिस

1
यदि आप बाहर निकलने के कोड को बदलना चाहते हैं, तो बाहर निकलने वाले
बेसिन

101

के लिए प्रलेखन सेsys.exit :

वैकल्पिक तर्क arg बाहर निकलने की स्थिति (शून्य में डिफ़ॉल्ट), या किसी अन्य प्रकार की वस्तु देने वाला पूर्णांक हो सकता है। यदि यह पूर्णांक है, तो शून्य को "सफल समाप्ति" माना जाता है और किसी भी गैर-अक्षीय मान को शेल और इस तरह "असामान्य समाप्ति" माना जाता है। अधिकांश प्रणालियों को इसे 0-127 की सीमा में होना चाहिए, और अन्यथा अपरिभाषित परिणाम उत्पन्न करना चाहिए। कुछ प्रणालियों में विशिष्ट निकास कोड के लिए विशिष्ट अर्थ निर्दिष्ट करने के लिए एक सम्मेलन होता है, लेकिन ये आमतौर पर अविकसित होते हैं; यूनिक्स प्रोग्राम आम तौर पर कमांड लाइन सिंटैक्स त्रुटियों के लिए 2 और अन्य सभी प्रकार की त्रुटियों के लिए 1 का उपयोग करते हैं।

एक उदाहरण जहां निकास कोड का उपयोग किया जाता है वे शेल स्क्रिप्ट में होते हैं। बैश में आप $?अंतिम निकास स्थिति के लिए विशेष चर की जांच कर सकते हैं :

me@mini:~$ python -c ""; echo $?
0
me@mini:~$ python -c "import sys; sys.exit(0)"; echo $?
0
me@mini:~$ python -c "import sys; sys.exit(43)"; echo $?
43

व्यक्तिगत रूप से मैं /usr/include/asm-generic/errno.h(लिनक्स सिस्टम पर) में मिलने वाले निकास कोड का उपयोग करने की कोशिश करता हूं , लेकिन मुझे नहीं पता कि क्या यह करना सही है।


3
एक अन्य पोस्ट से मुझे यह लिंक मिला: tldp.org/LDP/abs/html/exitcodes.html उपयोगी हो सकता है। :)
आइगर

9
misno.h आमतौर पर फंक्शन कॉल एक्जिट कोड के लिए होता है। प्रोग्राम एक्ज़िट कोड को मानकीकृत करने के प्रयासों के परिणामस्वरूप /usr/include/sysexits.h अधिकांश PIXIX सिस्टम पर मौजूद है।
mpounsett

1
यह जानना बहुत अच्छा है कि "यूनिक्स प्रोग्राम आमतौर पर कमांड लाइन सिंटैक्स त्रुटियों के लिए 2 का उपयोग करते हैं"!
डेंटिस्टन

2
@ डेंटिस्टन कॉन्सुर डाई हार्ड-इन-द-वूल गेंटू के वकील, फिर भी मुझे कभी नहीं पता था कि ... इस दिन तक। ( मेरी शर्म अब समाप्त हो गई है। ) ध्यान दें, जब कोई रेखा मेल नहीं खाती है और वास्तविक त्रुटियों पर grepबाहर निकलकर इस प्रवृत्ति को तोड़ती है । बहुत बहुत धन्यवाद, स्टैलमैन। 12
सेसिल करी

32

रिकॉर्ड के लिए, आप यहां परिभाषित POSIX मानक निकास कोड का उपयोग कर सकते हैं

उदाहरण:

import sys, os

try:
    config()
except:
    sys.exit(os.EX_CONFIG) 
try:
    do_stuff()
except:
    sys.exit(os.EX_SOFTWARE)
sys.exit(os.EX_OK) # code 0, all ok

3
डॉक्स के अनुसार ये केवल यूनिक्स ऑपरेटिंग सिस्टम पर उपलब्ध हैं इसलिए यह पूरी तरह से पोर्टेबल नहीं है।
फीनिक्स

1
यदि आप सभी ऑपरेटिंग सिस्टम पर उपलब्ध पोर्टेबल POSIX कोड चाहते हैं, तो exitstatusPyPI पैकेज देखें।
फीनिक्स

1
उस पैकेज की संपूर्णता सफलता के लिए 0 और असफलता के लिए 1 है।
पावेल मिनेव

25

एक errnoमॉड्यूल है जो मानक निकास कोड को परिभाषित करता है:

उदाहरण के लिए, अनुमति से इनकार किया गया त्रुटि कोड 13 है :

import errno, sys

if can_access_resource():
    do_something()
else:
    sys.exit(errno.EACCES)

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

2
आप सही हे। इनका उपयोग आंतरिक रूप से किया जाना है। लेकिन आप सामान्य रूप से अंतिम उपयोगकर्ता स्तर पर अपवाद नहीं उठाते हैं। आप sys.exit (x) का उपयोग x के साथ एक पूर्णांक के रूप में करते हैं जिसे आप मनमाने ढंग से चुनते हैं। लेकिन आप उन भीम का उपयोग EX_ के साथ कर सकते हैं और 'os' मॉड्यूल में परिभाषित कर सकते हैं। जैसे os.EX_OK या os.EX_IOERR
ओली

2
क्षमा करें, लेकिन मैं इसे भी कम कर रहा हूं क्योंकि यह भ्रामक है। बाहर निकलने की स्थिति कोड और त्रुटि संख्या विनिमेय / पूरक नहीं हैं। दिए गए उदाहरण का उपयोग करते हुए, "अनुमति से इनकार" में 13 का त्रुटि कोड (अनुसार errnoऔर ग़लती के अनुसार ) है, लेकिन 77 का निकास स्थिति कोड ( osऔर sysexits.h के अनुसार ) है। पूर्व में उत्सर्जन करने वाले कार्यक्रम गैर-मानक ( डी वल्को वेल जुरे ) हैं और दूसरों के साथ अच्छी तरह से नहीं खेलेंगे जो उत्तरार्द्ध की सही उम्मीद करते हैं।
मार्क जी।

14

0 से बाहर निकलें कोड का आमतौर पर मतलब है, "यहां कुछ भी गलत नहीं है।" हालाँकि, यदि स्क्रिप्ट का प्रोग्रामर कन्वेंशन का पालन नहीं करता है, तो इसका स्रोत देखने के लिए आपको स्रोत से परामर्श करना पड़ सकता है। आमतौर पर एक गैर-शून्य मान एक त्रुटि कोड के रूप में वापस किया जाता है।


6

जवाब है "यह निर्भर करता है कि बाहर निकलने का कोड शून्य का मतलब क्या है"

हालांकि, ज्यादातर मामलों में, इसका मतलब है "सब कुछ ठीक है"


मुझे POSIX पसंद है:

इसलिए, शेल पर, मैं टाइप करूंगा:

python script.py && echo 'OK' || echo 'Not OK'

अगर मेरी अजगर स्क्रिप्ट sys.exit(0)शेल को 'ओके' कहती है

अगर मेरी पाइथन स्क्रिप्ट कॉल sys.exit(1)(या कोई भी गैर-शून्य पूर्णांक), शेल 'ठीक नहीं है'

शेल के साथ चतुर होना आपका काम है, और आपकी स्क्रिप्ट के लिए प्रलेखन (या स्रोत) को पढ़ने के लिए यह देखना है कि निकास कोड का क्या मतलब है।


पूर्णता के लिए, 'नॉट ओके' प्रिंट किया जाएगा यदि पायथन स्क्रिप्ट में त्रुटि हुई या सिंटैक्स त्रुटि हुई।
शीतल शाह

5

ऑपरेटिंग सिस्टम कमांड में एक्जिट कोड होते हैं। इस पर कुछ सामग्री देखने के लिए लिनक्स एक्ज़िट कोड देखें। शेल यह तय करने के लिए एक्ज़िट कोड का उपयोग करता है कि क्या प्रोग्राम ने काम किया है, समस्याएँ हैं, या असफल। मानक (या कम से कम आमतौर पर उपयोग किए जाने वाले) निकास कोड बनाने के लिए कुछ प्रयास हैं। यह उन्नत शैल स्क्रिप्ट पोस्टिंग देखें ।


5

मैं sys.exit () का उपयोग करने के बजाय निकास (0) बिल्टिन के साथ एक साफ शटडाउन की सिफारिश करता हूं

मुझे यकीन नहीं है कि यह अच्छी सलाह है।

उल्लेख किया गया बहुत ही दस्तावेज़ीकरण पढ़ता है:

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

फिर:

निकास (कोड = कोई नहीं)

मुद्रित होने पर, "बाहर निकलने के लिए उपयोग करें () या Ctrl-D (यानी EOF)" जैसे संदेश प्रिंट करें, और जब कॉल किया जाता है, तो निर्दिष्ट निकास कोड के साथ SystemExit बढ़ाएं।

यदि हम इसकी तुलना sys.exit () प्रलेखन से करते हैं, तो यह उसी तंत्र का उपयोग कर रहा है जो SystemExitअपवाद को उठा रहा है।



4

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


2

कई प्रोग्रामिंग भाषाओं में कोड से बाहर निकलें प्रोग्रामर तक हैं। इसलिए आपको अपना प्रोग्राम सोर्स कोड (या मैनुअल) देखना होगा। शून्य का आमतौर पर मतलब होता है "सब ठीक हो गया"।


-2

अपवाद हैंडलर और अन्य चीजों को निष्पादित करने की अनुमति देने के लिए, मैं exit(0)उपयोग करने के बजाय बिलिन के साथ एक स्वच्छ शटडाउन की सिफारिश करता हूं, sys.exit()जो प्रक्रिया को अचानक समाप्त करता है।


तो क्या अंतर है? यह जानकारी कहां से आती है? क्या आपका मतलब "एग्जिट एट हैंडलर" का निष्पादन है या आप वास्तव में क्या बात कर रहे हैं? SystemExitकिसी भी तरह से बढ़ा हुआ प्रतीत होता है।
0xC0000022L

मिमी, मैंने इसे उलझा दिया os._exit, दोनों को लगता है SystemExit
19st में vidstige

1
गलत: सफाई की तरह, शटडाउन sys.exit() करता हैexit() । वे दोनों एक ही काम करते हैं: एक SystemExitअपवाद बढ़ाएं । दरअसल, exit()इंटरएक्टिव सत्रों के लिए होता है, लिपियों के लिए नहीं, इसलिए वैचारिक रूप sys.exit() से संकेत दिया जाता है। आप के साथ भ्रमित हो सकता है os._exit(), यह एक है कि अचानक समाप्त होता है।
MestreLion
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.