2009-02-22 14 views
14

मैं हमेशा मान लिया था कि अगर इसे बंद कर दिया जा रहा है बिना खोला गया था एक फ़ाइल का रिसाव करेगा, लेकिन मैं सिर्फ सत्यापित है कि अगर मैं कोड की निम्न पंक्तियां दर्ज करें, फ़ाइल बंद हो जाएगा:पाइथन बंद फ़ाइलों को कैसे जीते हैं?

>>> f = open('somefile.txt') 
>>> del f 

बस सरासर जिज्ञासा से बाहर , यह कैसे काम करता है? मैंने देखा है कि फ़ाइल में __ डेल __ विधि शामिल नहीं है।

उत्तर

19

सीपीथॉन में, फ़ाइल ऑब्जेक्ट को हटाए जाने पर फ़ाइलों को बंद कर दिया जाता है। CPython स्रोत में Objects/fileobject.c में file_dealloc फ़ंक्शन देखें। Dealloc विधियों को __del__ जैसे प्रकारों के लिए __del__ में निहित कुछ समस्याओं को छोड़कर क्रमबद्ध हैं।

+1

स्पष्टीकरण के लिए, __del__ को कचरा संग्रह के दौरान बुलाया जाता है, और फ़ाइल ऑब्जेक्ट्स के लिए पायथन के सी कार्यान्वयन में उस क्षण होता है जब फ़ाइल ऑब्जेक्ट का कोई और संदर्भ नहीं होता है। –

4

इसलिए कथन के साथ।

अजगर 2.5 के लिए,

from __future__ import with_statement 

का उपयोग करें (अजगर 2.6 या 3.x के लिए, कुछ भी नहीं)

with open("someFile", "rU") as aFile: 
    # process the file 
    pass 
# At this point, the file was closed by the with statement. 
# Bonus, it's also out of scope of the with statement, 
# and eligible for GC. 
+0

यही मैंने भी माना है। लेकिन पायथन 2.5.1 में ओएस एक्स पर, मेरे द्वारा पोस्ट किए गए कोड की रेखाएं पाइथन दुभाषिया को फ़ाइल (गतिविधि मॉनिटर में सत्यापित) जारी करने का कारण बनती हैं। –

+0

पाइथन को एकत्र होने पर फ़ाइल को बंद करना होता है। मैं fileobject.c में यह कहां से देख रहा हूं, लेकिन यह वहां नहीं है। यह शायद जीसी तंत्र में कहीं है, जहां मैं अगली देख रहा हूं। मुझे यह सवाल पसंद है। –

+0

ऐसा लगता है कि मैंने इसे fileobject.c में याद किया (गैलाघर देखें)। मैं वास्तव में चाहता हूं कि मुझे सीपीथन इंटर्नल्स की बेहतर समझ हो। –

0

सर्वश्रेष्ठ अनुमान है कि इसकी वजह फ़ाइल प्रकार है एक अंतर्निहित प्रकार, दुभाषिया स्वयं कचरा संग्रह पर फ़ाइल को बंद कर देता है।

वैकल्पिक रूप से, आप केवल पाइथन दुभाषिया से बाहर निकलने के बाद ही जांच कर रहे हैं, और सभी "लीक" फ़ाइल हैंडल वैसे भी बंद हैं।

+0

"आदिम प्रकार" (जावा से प्राप्त) की मेरी समझ एक प्राचीन के रूप में फ़ाइल नहीं छोड़ती है, क्योंकि पाइथन में कोई प्राइमेटिव नहीं है। –

+1

मुझे लगता है कि हूगाघुआह का मतलब था "अंतर्निर्मित प्रकार"। :) –

2

पायथन कचरा संग्रह के अलावा संदर्भ गणना और निर्धारक विनाश का उपयोग करता है। जब किसी ऑब्जेक्ट का कोई और संदर्भ नहीं होता है, तो वस्तु तुरंत जारी की जाती है। एक फाइल को रिहा कर इसे बंद कर देता है।

यह उदा। से अलग है जावा जहां केवल nondeterministic कचरा संग्रह है। इसका मतलब है कि ऑब्जेक्ट जारी होने पर आपको पता नहीं है, इसलिए आपको फ़ाइल को मैन्युअल रूप से बंद करना होगा।

ध्यान दें कि संदर्भ गणना सही नहीं है। आपके पास परिपत्र संदर्भों के साथ ऑब्जेक्ट हो सकते हैं, जो प्रोग्राम से पहुंच योग्य नहीं है। Thats क्यों संदर्भ गिनती के अलावा पाइथन कचरा संग्रह है।

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