2012-11-30 6 views
5

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.

Antwort

2

Ich habe mir die Freiheit genommen, ein Problem an bugs.python.org zu senden, lassen Sie uns abwarten, ob es funktioniert.

http://bugs.python.org/issue16597

EDIT: Sieht aus wie es ein Fehler, guter Fang ist!

+0

Danke für die Einreichung. –