2011-10-31 12 views
8

मैं एक bash स्क्रिप्ट कि वास्तव में क्या कर रहा है कि मैं क्या करना चाहते हैं लिखा है, लेकिन निम्न त्रुटि बाहर लात:को संबोधित करते sys.excepthook त्रुटि

close failed in file object destructor: sys.excepthook is missing lost sys.stderr

मैं पूरी तरह से स्टम्प्ड हूँ इसे कैसे संबोधित करें। यहां स्क्रिप्ट है:

#!/bin/bash 

usage() { echo "${0##*/} inputfile outputfile"; exit 1; } 

(($#==2)) || usage 

INPUTFILE="$1" 
OUTPUTFILE="$2" 

# All that is written between between the 'cat' command and 
#+ 'EOF' will be sent to the output file. 
cat <<EOF >$OUTPUTFILE 
$(date "+Generated on %m/%d/%y at %H:%M:%S") 

DATA AUDIT: $1 

------------ 
COLUMN NAMES 
------------ 

$(csvcut -n $INPUTFILE) 

--------------------------------------- 
FIRST TEN ROWS OF FIRST FIVE COLUMNS 
--------------------------------------- 

$(csvcut -c 1,2,3,4,5 $INPUTFILE | head -n 10) 

------------ 
COLUMN STATS 
------------ 

$(csvcut $INPUTFILE | csvstat) 

---END AUDIT 
EOF 

echo "Audited!" 

मैं शैल स्क्रिप्ट के लिए बहुत नया हूं और अजगर के लिए बहुत नया हूं। किसी भी सहायता के लिए आभारी रहेंगे।

+1

त्रुटि आपके बैश स्क्रिप्ट से नहीं, पाइथन स्क्रिप्ट (csvcut?) से आता है। इसके कोड को प्रासंगिक कोड देखने के लिए और अधिक उपयोगी होगा: डी –

+0

यह हो सकता है कि सीएसवीक्यू सिर को पसंद न करे, क्योंकि यह प्रक्रिया के stdout को समय-समय पर बंद करने के लिए मजबूर करता है? –

+0

@ एन्टी, मैं अनुमान लगा रहा था कि यह मामला है, लेकिन सोच रहा है कि स्क्रिप्ट में ऐसा कुछ था जो समस्या को हल करेगा, क्योंकि कमांड लाइन पर व्यक्तिगत रूप से कमांड चलाने से त्रुटि उत्पन्न नहीं होती है। क्या आपको पता है कि संभावित स्टडआउट मुद्दे को हल करने के लिए सिर कैसे बदला जा सकता है? या फिर इसके लिए csvcut कोड आवश्यक होगा? और धन्यवाद! –

उत्तर

18

मैं पाइथन 2.6.2 स्क्रिप्ट से head में bash में उबंटू 9.04 पर आउटपुट पाइप करते समय यह त्रुटि देख रहा था। मैं स्क्रिप्ट बाहर निकलने से पहले stdout और stderr बंद करने के लिए try ब्लॉकों कहा:

try: 
    sys.stdout.close() 
except: 
    pass 
try: 
    sys.stderr.close() 
except: 
    pass 

मैं अब त्रुटि देख रहा हूँ।

चरण 1::

+0

कोई स्पष्टीकरण क्यों यह काम करता है? मुझे यह त्रुटि एक साइथन स्क्रिप्ट में मिल रही है जो डुप्ली/डुप्ली 2 के साथ कुछ पुनर्निर्देशन करता है और यह चीजों को ठीक करने लगता है। – Snorfalorpagus

+1

प्रासंगिक पायथन बग: http://bugs.python.org/issue11380 –

+1

समाधान'close' के बजाय '.flush' पर कॉल के साथ भी काम करता है। मुझे नहीं पता कि इसका मतलब कुछ भी है या नहीं। ('बंद 'का अर्थ है' फ्लश')। पाइथन 2.7.8 उबंटू पर 14.04 –

1

मुझे लगता है कि csvcut पायथन स्क्रिप्ट अन्यथा कार्यात्मक है लेकिन जब यह फ़ाइलों को बंद करने और बाहर निकलने का प्रयास करती है तो एक त्रुटि फेंक रही है।

यदि आप कहते हैं, तो स्क्रिप्ट अन्यथा काम कर रही है और यह मानती है कि त्रुटि 'csvcut' stderr पर आउटपुट फेंक रही है, फिर इसे/dev/null पर रीडायरेक्ट करना एक अस्थायी फिक्स होगा।

cat <<EOF >$OUTPUTFILE 2>/dev/null 

स्वाभाविक रूप से आपके हेरेडोक में कोई अन्य त्रुटि संदेश भी पुनर्निर्देशित करेगा।

+0

एक अस्थायी फिक्स के रूप में भी, यह मेरे लिए काम नहीं कर रहा है। अभी भी एक ही त्रुटि हो रही है। –

3

दो कदम तुम करने की आवश्यकता हैं

अपने csvcut स्क्रिप्ट में, सभी स्थानों जहां sys.stdout.write() कहा जाता है खोजने के लिए सुनिश्चित करें sys.stdout.flush() प्रत्येक write() के बाद कहा जाता है बनाते हैं।

चरण 2:

चरण 1 पूरा आप अब अजगर स्क्रिप्ट के भीतर IOError पर कब्जा करने में सक्षम होना चाहिए के साथ

। नीचे टूटा पाइप को संभालने के तरीके पर एक उदाहरण दिया गया है:

try: 
    function_with_sys_stdout_write_call() 
except IOError as e: 
    # one example is broken pipe 
    if e.strerror.lower() == 'broken pipe': 
     exit(0) 
    raise  # other real IOError 

आशा है कि इससे मदद मिलती है!

+0

यह मेरे मामले में एक उचित फिक्स था। ऐसा लगता है कि एक ट्रेसबैक अभी भी stderr पर लिखा जा रहा था, जबकि लिपि छोड़ने से पहले स्क्रिप्ट छोड़ रहा था और stderr flusing। – hayavuk

संबंधित मुद्दे