2011-10-07 15 views
38

मैं एक पाइथन स्क्रिप्ट समेत एक वैज्ञानिक सॉफ्टवेयर का उपयोग कर रहा हूं जो os.system() पर कॉल कर रहा है जिसका उपयोग एक और वैज्ञानिक कार्यक्रम चलाने के लिए किया जाता है। उपप्रक्रिया चल रहा हो, अजगर कुछ बिंदु प्रिंट पर निम्न:os.srror() के दौरान "IOError: [Errno 9] खराब फ़ाइल वर्णनकर्ता" का कारण क्या हो सकता है?

close failed in file object destructor: 
IOError: [Errno 9] Bad file descriptor 

मुझे विश्वास है कि इस संदेश को os.system() रिटर्न के रूप में एक ही समय में छपा है।

मेरे सवालों का अब कर रहे हैं:

कौन सा स्थिति IOError के इस प्रकार के लिए नेतृत्व कर सकते हैं? इसका क्या मतलब है? os.system() द्वारा उपप्रोसेसर के लिए इसका क्या अर्थ है?

+2

नोट: 'subprocess' मॉड्यूल का उपयोग कर [बेहतर है] (http:// oocssthstem.org/library/os.html#os.system) 'os.system() 'पर। –

+0

:-) मुझे पता है कि इस सॉफ्टवेयर में बहुत सारी गैर-परिपूर्ण चीजें हैं। –

उत्तर

35

आप फ़ाइल वस्तु की close() विधि से नहीं यानी यह त्रुटि संदेश मिलता है एक अजगर फ़ाइल "बाहर" से बंद हो गया,:

>>> f = open(".bashrc") 
>>> os.close(f.fileno()) 
>>> del f 
close failed in file object destructor: 
IOError: [Errno 9] Bad file descriptor 

लाइन del f, फ़ाइल वस्तु के लिए अंतिम संदर्भ हटा देता है के कारण इसके विनाशक file.__del__ को बुलाया जाना है। फ़ाइल ऑब्जेक्ट की आंतरिक स्थिति इंगित करती है कि फ़ाइल अभी भी खुली है क्योंकि f.close() कभी नहीं कहा गया था, इसलिए विनाशक फ़ाइल को बंद करने का प्रयास करता है। ओएस बाद में एक फ़ाइल को बंद करने के प्रयास की वजह से एक त्रुटि फेंकता है जो खुला नहीं है।

os.system() के कार्यान्वयन के बाद से कोई पाइथन फ़ाइल ऑब्जेक्ट्स नहीं बनाते हैं, ऐसा लगता है कि system() कॉल त्रुटि की उत्पत्ति है। शायद आप थोड़ा और कोड दिखा सकते हैं?

+0

धन्यवाद .. मुझे पहले से ही यह संदेह था। इस बिंदु पर अधिक कोड दिखाना नहीं होगा, क्योंकि यह पायथन लिपि काफी बड़ी है, अच्छी तरह से संरचित नहीं है और अच्छी तरह लिखित नहीं है। मेरे पास अभी तक बहुत अच्छा अवलोकन नहीं है। आपकी जानकारी की सहायता से, मैं खुद को इस मुद्दे को पहले खोजने की कोशिश करूंगा। –

+0

एक और सवाल: आपके उदाहरण में, आपने 'f.close()' के बजाय 'del f' का उपयोग किया था, जिसके परिणामस्वरूप ट्रेसबैक हुआ होगा। पाइथन के कचरे के संग्रहण के दौरान क्या होता है इसके साथ 'del f' समतुल्य है? –

+0

मेरा पहला अनुमान यह है कि एमपीआई समांतरता के स्क्रिप्ट बनाने के उपयोग के साथ इसका कुछ संबंध है - यानी विभिन्न प्रक्रियाओं के बीच साझा फ़ाइल वर्णनकर्ता। –

10

यदि आप फ़ाइल खोलते समय गलत मोड का उपयोग करते हैं तो आप यह त्रुटि प्राप्त कर सकते हैं। उदाहरण के लिए:

with open(output, 'wb') as output_file: 
     print output_file.read() 

कि कोड में, मैं फ़ाइल पढ़ना चाहते हैं, लेकिन मैं मोड wb बजाय r या का उपयोग r+

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