2011-10-17 7 views

Respuesta

6

Comprobar f.fileno(), debe ser el mismo que fi. Solo debe cerrar el descriptor de archivo una vez, por lo que el segundo es correcto.

En Unix, el primer provoca un error:

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

Gotcha. un poco confuso: abrir dos veces, cerrar una vez. pero entiendo la idea – Claudiu

+1

'os.fdopen()' no necesariamente abre el descriptor del archivo, simplemente devuelve un objeto de archivo abierto para el archivo desciptor. Si el descriptor de archivo ya está abierto, no lo abrirá nuevamente. –

+0

@Claudiu: Se debe a que el sistema operativo hace una diferencia entre los * descriptors * del archivo (que son objetos del nivel del sistema operativo) y los * streams * del archivo * (que son objetos a nivel de la biblioteca). 'fopen' (' open' en Python) abre un descriptor, luego abre una secuencia usando este descriptor. 'fdopen' abre una nueva secuencia usando un descriptor existente. 'fclose' (' file.close' en Python) cierra una secuencia y su descriptor subyacente. – millimoose

1

que haría:

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

Si en un pitón suficientemente reciente, se puede jugar golf esto a:

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

jejeje, pero necesito el camino en este caso – Claudiu

0

Si va a escribir en el último ejemplo necesitaría:

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

Continuando con el seguimiento de las respuestas más recientes, si usted necesita la ruta:

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) 
Cuestiones relacionadas