Der folgende Python-3-Code ein seltsames Verhalten zeigt (für mich zumindest) wenn ich laufe es durch strace
:Was passiert mit Dateideskriptoren in Python 3, wenn .close() fehlschlägt?
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()
Da I/O gepuffert ist, wenn Sie diesen Code mit /dev/full
laufen, es doesn‘ t scheitern bis fp
schließt am Ende der with
Block. Das ist keine Überraschung. In Python 2.7.3rc2 (auf meinem System), wird der Code der Ausnahmebehandler nach dem Dateideskriptor tatsächlich Schließen entsprechend fp
:
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
jedoch in Python 3.2.3 (auf meinem System), den Dateideskriptor nach dem Ausnahmeblock läuft, ist noch offen:
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
der Interpreter versucht, auf die Datei noch ein paar mal und nicht still zu schreiben. Wann ruft Python tatsächlich close()
? Was ruft es auf? Dieses Verhalten scheint einen Dateideskriptor zu verlieren.
Danke für die Einreichung. –