2011-10-17 5 views

Odpowiedz

6

Sprawdź f.fileno(), powinna być taka sama jak fi. Powinieneś zamknąć tylko ten deskryptor pliku raz, więc drugi jest poprawny.

Na Unix, pierwsza powoduje błąd:

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

Gotcha. nieco mylące: otwórz dwa razy, zamknij raz. ale mam pomysł – Claudiu

+1

'os.fdopen()' niekoniecznie otwiera deskryptor pliku, po prostu zwraca otwarty obiekt pliku dla desciptora pliku. Jeśli deskryptor pliku jest już otwarty, nie otworzy go ponownie. –

+0

@Claudiu: To dlatego, że OS robi różnicę między deskryptorami plików * (które są obiektami na poziomie OS) i plikami * strumieniami * (które są obiektami poziomu libc). 'fopen' (' open' w języku Python) otwiera deskryptor, a następnie otwiera strumień za pomocą tego deskryptora. 'fdopen' otwiera nowy strumień przy użyciu istniejącego deskryptora. 'fclose' (' file.close' w Pythonie) zamyka strumień i jego bazowy deskryptor. – millimoose

1

zrobiłbym:

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

Jeśli na tyle niedawno Pythonie można golf to w dół do:

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

hehe ładny, ale potrzebuję ścieżki w tym przypadku – Claudiu

0

Jeśli zamierzasz pisać w ostatnim przykładzie, potrzebujesz:

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

Kontynuując dalsze działania na najnowszych odpowiedzi, jeśli trzeba ścieżkę:

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)