2012-11-30 20 views
5

निम्नलिखित पायथन 3 कोड कुछ अजीब व्यवहार दिखाता है (मेरे लिए, कम से कम) जब मैं यह strace के माध्यम से चलाने:जब Python 3 में फ़ाइल डिस्क्रिप्टर फ़ाइल फ़ाइल का होता है तो .close() विफल रहता है?

import os 
import sys 

if len(sys.argv) != 2: 
    print('Usage: ecpy <filename>') 
sys.exit(1) 
try: 
    print('my PID: %d' % os.getpid()) 
    with open(sys.argv[1], 'w') as fp: 
     try: 
      fp.write('Hello Stack Overflow!') 
     except IOError as e: 
      print('### before close') 
      print(str(e)) 
      sys.stdout.flush() 
except IOError as e: 
    print('### after close') 
    print(str(e)) 
    sys.stdout.flush() 

print('### after exception block') 
sys.stdout.flush() 

मैं के बाद से/ओ बफ़र है, यदि आप /dev/full के साथ इस कोड चलाने के लिए, यह नहीं करता है ' fpwith ब्लॉक के अंत में बंद होने तक विफल रहता है। यह कोई आश्चर्य नहीं है। फ़ाइल वर्णनकर्ता (अपने सिस्टम पर)

write(3, "Hello Stack Overflow!", 21) = -1 ENOSPC (No space left on device) 
close(3)        = 0 
munmap(0x7f9de3f78000, 4096)   = 0 
write(1, "### after close\n", 16)  = 16 
write(1, "[Errno 28] No space left on devi"..., 35) = 35 
write(1, "### after exception block\n", 26) = 26 

हालांकि, पायथन 3.2.3 में,: अजगर 2.7.3rc2 (अपने सिस्टम पर) में, कोड वास्तव में फ़ाइल वर्णनकर्ता fp करने के लिए इसी बंद करने के बाद अपवाद संचालक चलाता है अभी भी अपवाद ब्लॉक रन के बाद खुला है:

write(3, "Hello Stack Overflow!", 21) = -1 ENOSPC (No space left on device) 
write(1, "### after close\n", 16)  = 16 
write(1, "[Errno 28] No space left on devi"..., 35) = 35 
write(1, "### after exception block\n", 26) = 26 
... 
write(3, "Hello Stack Overflow!", 21) = -1 ENOSPC (No space left on device) 
write(3, "Hello Stack Overflow!", 21) = -1 ENOSPC (No space left on device) 
close(3)        = 0 

दुभाषिया फाइल करने के लिए कुछ और अधिक बार लिखने की कोशिश करता है और चुपचाप विफल रहता है। पाइथन वास्तव में close() पर कॉल कब करता है? इसका क्या आक्रमण कर रहा है? यह व्यवहार एक फाइल डिस्क्रिप्टर रिसाव प्रतीत होता है।

उत्तर

2

मैंने bugs.python.org पर कोई समस्या सबमिट करने की स्वतंत्रता ली, चलो प्रतीक्षा करें और देखें कि क्या यह बाहर निकलता है या नहीं।

http://bugs.python.org/issue16597

संपादित करें: ऐसा लगता है कि यह एक बग, अच्छा पकड़ है!

+0

जमा करने के लिए धन्यवाद। –