2012-11-30 23 views
5

Aşağıdaki Python 3 kodu (bana, en azından) Ben strace aracılığıyla çalıştırdığınızda bazı garip davranışlar sergiler:.close() başarısız olduğunda Python 3'teki dosya tanıtıcılarına ne olur?

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() 

I yana/Ç tamponlu, görebilmek /dev/full ile bu kodu çalıştırırsanız, bu kokan t fpwith bloğunun sonundaki kapanmaya kadar başarısız. Bu sürpriz değil. (Sistemimde) Python 3.2.3 yılında,

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 

Ancak dosya tanıtıcı: (sistemimde) Python 2.7.3rc2, kod aslında fp tekabül dosya tanıtıcı kapattıktan sonra istisna işleyicisi çalışır hala istisna blok çalıştırıldıktan sonra açıktır:

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 

tercüman dosyasına birkaç kez daha yazmaya çalıştığında ve sessizce başarısız olur. Python aslında ne zaman close() diyor? Ne çağırıyor? Bu davranış bir dosya tanıtıcısını sızdırıyor gibi görünüyor.

cevap

2

Bugs.python.org adresine bir konu sunma hürriyeti aldım, bekleyelim ve dışarı çıkıp çıkmadığını görelim.

http://bugs.python.org/issue16597

EDIT: Bu bir hata, iyi yakalamak gibi görünüyor!

+0

Gönderim için teşekkürler. –

İlgili konular