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


13

मेरे पास आर्कजीआईएस 10.0 के लिए एक आर्कपी टूल स्क्रिप्ट है जिसमें दो प्रमुख कार्यात्मक खंड हैं। उपयोगकर्ता दूसरे खंड को चलाने के लिए चुन सकता है या नहीं। यदि उपयोगकर्ता दूसरे खंड को चलाने के लिए नहीं चुनता है, तो मैं केवल एक सफाई कार्य चलाना चाहता हूं और उपकरण परिणाम विंडो में एक त्रुटि संदेश पोस्ट किए बिना sys.exit (0) के साथ स्क्रिप्ट से बाहर निकलना चाहता हूं जीएसआई-एसई में यहां दो प्रमुख सूत्र हैं, जो आर्कपी स्क्रिप्ट से बाहर निकलने के बारे में हैं, लेकिन इसमें समाधान विशेष रूप से त्रुटि संदेश को संबोधित नहीं करते हैं। कोड की सामान्य संरचना इस प्रकार है:

import sys
##import arcpy

def CleanUp():
    print 'Cleaning up ...\n'

def finish():
    CleanUp()
    print 'Exiting ...'
    sys.exit(0)

do_more = False  #or True ... input from user

#Section 1:  do some stuff
print 'Doing some stuff ...\n'

if not do_more:
    finish()

#Section 2:  do more stuff
print 'doing more stuff ...'
CleanUp()

अगर मैं आर्कगिस / आर्कपी के बाहर पायथन दुभाषिया में इस कोड को चलाता हूं, तो यह काम करता है जैसा कि मैं अपेक्षा करता हूं, बिना किसी त्रुटि संदेश के इनायत से बाहर निकलना; हालाँकि, मेरी आर्कपी स्क्रिप्ट में इसी संरचना के साथ, स्क्रिप्ट से बाहर निकलता है, लेकिन टूल परिणाम विंडो में एक SystemExit त्रुटि संदेश पोस्ट किया जाता है। वहाँ एक तरीका है चापलूसी उपकरण स्क्रिप्ट अपवाद खाने और SystemExit त्रुटि संदेश दफनाने के लिए है?


बस एक जंगली छुरा यहाँ ले जा रहा है, लेकिन क्या यह संभव है कि आप अपनी स्क्रिप्ट में SystemExit को कॉल करने से पहले "del arcpy" कर सकें?

@ - मुझे संदेह है, लेकिन यह एक दिलचस्प विचार है ... हम्मम ... क्या बिल्ली। मैं इसे एक चक्कर दूँगा।
celticflute

1
संक्षिप्त कोड उदाहरण पोस्ट करने के लिए धन्यवाद जो स्पष्ट रूप से तर्क का चित्रण करता है और एक्स्ट्रा को छोड़ देता है। +1
मैट विल्की

जवाबों:


8

संक्षिप्त उत्तर: 10.1 में तय किया गया। अभी के लिए, आपको अतिरिक्त स्तर का इंडेंटेशन जोड़ने की आवश्यकता है। हालांकि यह आपके कोड के लिए कुछ उपयोगी रिफैक्टिंग को प्रोत्साहित कर सकता है। किसी भी समय आपको एक ही स्क्रिप्ट / रूटीन में बड़ी संख्या में लाइनें मिलती हैं, आप इसे छोटे वर्गों (फ़ंक्शंस, क्लासेस) में काटने के बारे में सोचना चाहेंगे।

def main():
    <your code>

if __name__ == "__main__":
    try:
        main()
    except SystemExit as err:
        pass

धन्यवाद, जेसन। हां, मुझे गोली और रिफ्लेक्टर को काटना चाहिए। यह सिर्फ इतना है कि ग्राहक मेरी गर्दन नीचे साँस लेने के साथ करना मुश्किल है। ऐसे जीवन है।
सेल्टिकफ्लूट 17

3

ArcPy आपके पायथन परिवेश के साथ खिलवाड़ करता है । संक्षेप में, या तो sys.exit () नहीं करते हैं या खोजते हैं / जो कि sys.exit () कॉल करने से पहले आर्कपी के "क्लीन-बिफोर-एग्जिट" (यदि कोई मौजूद है) फ़ंक्शन करता है।


2
जिस तरह से पायथन के निष्पादन योग्य हैंडल sys.exit()एक प्रकार की गंदी चाल है - कॉलिंग exitएक SystemExitअपवाद को जन्म देती है और शीर्ष-स्तरीय दुभाषिया, जो आम तौर पर एक ट्रेसबैक प्रिंट करता है, अपवाद प्रकार का पता लगाएगा और दुभाषिया को समाप्त करेगा। एक अन्य एप्लिकेशन में पायथन दुभाषिया को एंबेड करना, जैसे कि एग्जीक्यूटिव्स का आर्कगिस परिवार, इस तरह के कार्यान्वयन-विशिष्ट कोड की एक गैर-मात्रा में आवश्यकता होती है।
बजे जेसन शहीर

2

मैं SystemExit त्रुटि संदेश को 'दफनाने' का तरीका नहीं जानता, लेकिन आप sys.exit को कॉल करने से बचने के लिए हमेशा अपने कोड का पुनर्गठन कर सकते हैं

import sys
##import arcpy

def DoMoreStuff():
    print 'doing more stuff ...'

def CleanUp():
    print 'Cleaning up ...'

def finish():
    CleanUp()
    print 'Exiting ...'

do_more = False  #or True ... input from user

#Section 1:  do some stuff
print 'Doing some stuff ...'

if do_more:DoMoreStuff()

finish()

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