2011-10-17 23 views

Trả lời

6

Kiểm tra f.fileno(), nó phải là giống như fi. Bạn chỉ nên đóng bộ mô tả tập tin đó một lần, vì vậy phần thứ hai là chính xác.

Trên Unix, là người đầu tiên gây ra một lỗi:

>>> f.close() 
>>> os.close(fi) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
OSError: [Errno 9] Bad file descriptor 
+0

Gotcha. một chút bối rối: mở hai lần, đóng một lần. nhưng tôi nhận được ý tưởng – Claudiu

+1

'os.fdopen()' không nhất thiết phải mở bộ mô tả tệp, nó chỉ trả về đối tượng tệp mở cho tệp desciptor. Nếu bộ mô tả tập tin đã được mở, nó sẽ không mở lại. –

+0

@Claudiu: Đó là vì hệ điều hành tạo sự khác biệt giữa các tệp * descriptors * (là các đối tượng cấp hệ điều hành) và tệp * stream * (là các đối tượng cấp libc). 'fopen' (' mở' trong Python) mở một bộ mô tả, sau đó mở một luồng bằng cách sử dụng bộ mô tả này. 'fdopen' mở một luồng mới bằng cách sử dụng một bộ mô tả hiện có. 'fclose' (' file.close' trong Python) đóng luồng và mô tả cơ bản của nó. – millimoose

1

tôi sẽ làm:

fi, path = tempfile.mkstemp() 
f = os.fdopen(fi, "w") 
try: 
    f.write(res) 
finally: 
    f.close() 
2

Nếu trên Python đủ gần đây, bạn có thể chơi golf này xuống:

with os.fdopen(tempfile.mkstemp()[0]) as f: 
    f.write(res) 
+0

hehe đẹp, nhưng tôi cần con đường trong trường hợp này – Claudiu

0

Nếu bạn định viết ví dụ sau, bạn cần:

with os.fdopen(tempfile.mkstemp()[0], 'w') as f: 
    f.write(res) 
2

Tiếp tục theo dõi trên các câu trả lời gần đây nhất, nếu bạn cần đường dẫn:

f_handle, f_path = tempfile.mkstemp() 
with os.fdopen(f_handle, 'w') as f: 
    f.write(res) 

try: 
    # Use path somehow 
    some_function(f_path) 

finally: 
    # Clean up 
    os.unlink(f_path) 
Các vấn đề liên quan