निम्नलिखित पायथन 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
के साथ इस कोड चलाने के लिए, यह नहीं करता है ' fp
with
ब्लॉक के अंत में बंद होने तक विफल रहता है। यह कोई आश्चर्य नहीं है। फ़ाइल वर्णनकर्ता (अपने सिस्टम पर)
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()
पर कॉल कब करता है? इसका क्या आक्रमण कर रहा है? यह व्यवहार एक फाइल डिस्क्रिप्टर रिसाव प्रतीत होता है।
जमा करने के लिए धन्यवाद। –