2012-11-30 21 views
5

Sau đây Python 3 đang thể hiện một số hành vi kỳ lạ (với tôi, ít nhất) khi tôi chạy nó thông qua strace:Điều gì sẽ xảy ra với các bộ mô tả tệp trong Python 3 khi .close() không thành công?

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

Kể từ I/O được đệm, nếu bạn chạy mã này với /dev/full, nó doesn' t không thành công cho đến khi fp đóng vào cuối khối with. Đó là không có gì ngạc nhiên. Trong Python 2.7.3rc2 (trên hệ thống của tôi), mã chạy bộ xử lý ngoại lệ sau khi thực sự đóng bộ mô tả tập tin tương ứng với 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 

Tuy nhiên, trong Python 3.2.3 (trên hệ thống của tôi), mô tả tập tin vẫn mở sau khi khối ngoại lệ chạy:

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 

Trình thông dịch cố gắng ghi vào tệp một vài lần và không hoạt động âm thầm. Khi nào thì Python thực sự gọi close()? Cái gì đang gọi nó? Hành vi này dường như làm rò rỉ một bộ mô tả tập tin.

Trả lời

2

Tôi lấy sự tự do khi gửi một vấn đề tới bug.python.org, chúng ta hãy chờ xem liệu nó có mở ra không.

http://bugs.python.org/issue16597

EDIT: Có vẻ như đó là lỗi, bắt tốt!

+0

Cảm ơn bạn đã gửi. –

Các vấn đề liên quan