Il Python 3 codice seguente espone alcuni comportamenti strani (per me, almeno) quando l'eseguo attraverso strace
:Cosa succede ai descrittori di file in Python 3 quando .close() fallisce?
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()
Dal I/O è tamponata, se si esegue questo codice con /dev/full
, esso doesn' t fallire fino a quando fp
si chiude alla fine del blocco with
. Non è una sorpresa. In Python 2.7.3rc2 (sul mio sistema), il codice viene eseguito il gestore di eccezioni, dopo la chiusura in realtà il descrittore di file corrispondente alla 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
Tuttavia, in Python 3.2.3 (sul mio sistema), il descrittore di file è ancora aperto dopo l'esecuzione del blocco di eccezione:
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
l'interprete cerca di scrivere sul file di un paio di volte e non riesce in silenzio. Quando Python chiama in realtà close()
? Cosa lo sta invocando? Questo comportamento sembra perdere un descrittore di file.
Grazie per l'invio. –