2009-06-22 6 views
10

के साथ बुलाए गए स्क्रिप्ट के निष्पादन को रोकें क्या किसी अन्य/अन्य कथन का उपयोग किए बिना execfile फ़ंक्शन के साथ बुलाए गए पायथन स्क्रिप्ट को निष्पादित करना संभव है? मैंने exit() को आजमाया है, लेकिन यह main.py को समाप्त करने की अनुमति नहीं देता है।execfile

# main.py 
print "Main starting" 
execfile("script.py") 
print "This should print" 

# script.py 
print "Script starting" 
a = False 

if a == False: 
    # Sanity checks. Script should break here 
    # <insert magic command>  

# I'd prefer not to put an "else" here and have to indent the rest of the code 
print "this should not print" 
# lots of lines below 
+0

तुम क्यों प्रयोग कर रहे हैं execfile() और आयात नहीं? – ephemient

+0

मुझे लगता है कि जब मैं एक अलग विंडो में स्क्रिप्ट संपादित कर रहा हूं और उन्हें फ्लाई – JcMaco

उत्तर

15

main एक try/except ब्लॉक में execfile लपेट कर सकते हैं:। sys.exit एक SystemExit अपवाद को जन्म देती है mainexcept क्लॉज में सामान्य रूप से इसके निष्पादन को जारी रखने के लिए पकड़ सकता है, यदि वांछित हो। Ie, main.py:

try: 
    execfile('whatever.py') 
except SystemExit: 
    print "sys.exit was called but I'm proceeding anyway (so there!-)." 
print "so I'll print this, etc, etc" 

और whatever.pysys.exit(0) या जो कुछ भी समाप्त करने के लिए अपने स्वयं के केवल निष्पादन उपयोग कर सकते हैं। कोई अन्य अपवाद तब तक काम करेगा जब तक कि यह execfile डी स्रोत के बीच सहमत हो और execfile कॉल करने वाला स्रोत - लेकिन SystemExit विशेष रूप से उपयुक्त है क्योंकि इसका अर्थ स्पष्ट है!

+0

यह मेरे लिए हैक की तरह लगता है। यद्यपि पायथन एक अपवाद-अनुकूल भाषा है ... –

+3

रैखिक कोड से जल्दी बाहर निकलने के लिए वापसी, जारी, ब्रेक या raise (sys.exit() को बढ़ाने का एक विशेष मामला होना आवश्यक है)। इस संदर्भ में आईएमओ * कम से कम * हैकिश उठाएं। –

+2

@ मैथ्यू, मैं @ रिक से सहमत हूं: पायथन में, अपवाद असाधारण नहीं हैं (उदाहरण के लिए _every_ के सामान्य छोर पर रोकथाम, उदाहरण के लिए!), इसलिए exec'd-file को समाप्त करने के लिए एक का उपयोग करना निष्पादन मुझे स्वीकार्य लगता है। –

3
# script.py 
def main(): 
    print "Script starting" 
    a = False 

    if a == False: 
     # Sanity checks. Script should break here 
     # <insert magic command>  
     return; 
     # I'd prefer not to put an "else" here and have to indent the rest of the code 
    print "this should not print" 
    # lots of lines bellow 

if __name__ == "__main__": 
    main(); 

मैं (__name__ == "__main__ ", आदि) अजगर के इस पहलू को खोजने परेशान

+0

पर निष्पादित कर रहा हूं तो निष्पादन फ़ाइल अधिक लचीलापन की अनुमति देता है आपके द्वारा पोस्ट किए गए कोड में दो छोटी त्रुटियां हैं: "प्रिंट" यह मुद्रित नहीं होना चाहिए "" और वापसी को अर्धविराम की आवश्यकता नहीं है। धन्यवाद, मुझे लगता है कि मैं इसका इस्तेमाल करूंगा। – JcMaco

+0

लेकिन फिर लाइनों को इंडेंट किया गया है, जो ओपी से बचना चाहता है। मुझे समझ में नहीं आ रहा है कि क्यों इंडेंटिंग से बचा जाना चाहिए। –

+0

मैंने प्रिंट तय किया। हालांकि मैं सेमी-कोलन रख रहा हूं। ;) आह, मैं महत्वपूर्ण सफेद जगह से कैसे नफरत करता हूं। :) –

1

सादे पुराने अपवाद हैंडलिंग के साथ क्या गलत है?

scriptexit.py

class ScriptExit(Exception): pass 

main.py

from scriptexit import ScriptExit 
print "Main Starting" 
try: 
    execfile("script.py") 
except ScriptExit: 
    pass 
print "This should print" 

script.py

from scriptexit import ScriptExit 
print "Script starting" 
a = False 

if a == False: 
    # Sanity checks. Script should break here 
    raise ScriptExit("A Good Reason") 

# I'd prefer not to put an "else" here and have to indent the rest of the code 
print "this should not print" 
# lots of lines below 
संबंधित मुद्दे