2011-03-17 12 views
35

¿Hay alguna forma de que pueda escribir en el archivo de temp y lo incluya en un comando, y luego cerrarlo/eliminarlo? Me gustaría ejecutar el comando, por ejemplo: some_command/tmp/some-temp-file.
Muchas gracias de antemano.crear y leer desde el archivo de temp

import tempfile 
temp = tempfile.TemporaryFile() 
temp.write('Some data') 
command=(some_command temp.name) 
temp.close() 

Respuesta

27

Si necesita un archivo temporal con un nombre que tiene que utilizar la función NamedTemporaryFile. Entonces puede usar temp.name. Lea http://docs.python.org/library/tempfile.html para más detalles.

+9

Asegúrese de lavar el archivo antes de pasar a alguna_comando – balki

+1

@balki o puede pasar 'bufsize = 0' para que no esté almacenado. –

1

Utilice un NamedTemporaryFile y su miembro de name lugar. Un TemporaryFile regular ni siquiera se garantiza que tenga un nombre, debido a la forma en que funciona el Unix filesystems.

13

Prueba esto:

import tempfile 
import commands 
import os 

commandname = "cat" 

f = tempfile.NamedTemporaryFile(delete=False) 
f.write("oh hello there") 
f.close() # file is not immediately deleted because we 
      # used delete=False 

res = commands.getoutput("%s %s" % (commandname,f.name)) 
print res 
os.unlink(f.name) 

Simplemente imprime el contenido de las el archivo temporal, pero eso debería darte la idea correcta. Tenga en cuenta que el archivo está cerrado (f.close()) antes de que el proceso externo pueda verlo. Eso es importante: garantiza que todas tus operaciones de escritura se vacíen correctamente (y, en Windows, que no estás bloqueando el archivo). NamedTemporaryFile las instancias generalmente se eliminan tan pronto como se cierran; de ahí el bit delete=False.

Si desea tener más control sobre el proceso, puede probar subprocess.Popen, pero parece que commands.getoutput puede ser suficiente para sus propósitos.

+1

Esta respuesta (especialmente 'delete = False' y' close() ') es información clave para el caso de Windows. Gracias. – meowsqueak

66

Ejemplo completo.

import tempfile 
with tempfile.NamedTemporaryFile() as temp: 
    temp.write('Some data') 
    if should_call_some_python_function_that_will_read_the_file(): 
     temp.seek(0) 
     some_python_function(temp) 
    elif should_call_external_command(): 
     temp.flush() 
     subprocess.call(["wc", temp.name]) 

actualización: Como se ha mencionado en los comentarios, esto puede no funcionar en Windows. Use la solución this para Windows

+11

Solo quiero agregar que si el comando es reemplazado por algún código de Python (como una llamada a función) asegúrese de hacer temp.seek (0) así que si esa función intenta leer el contenido, no estará vacía. – Fortepianissimo

+3

+1 para el uso de _with_. ¿Hay alguna razón por la que los ejemplos en la [documentación] (https://docs.python.org/2/library/tempfile.html) no usen _with_? – cbare

+2

Asegúrese de considerar esto desde los [documentos] (https://docs.python.org/3.4/library/tempfile.html#tempfile.NamedTemporaryFile): "Si el nombre se puede utilizar para abrir el archivo por segunda vez, mientras que el archivo temporal nombrado todavía está abierto, * varía en todas las plataformas * (puede usarse así en Unix, no puede en Windows NT o posterior). " Tenga en cuenta que el uso de la declaración 'with' mantiene el archivo temporal abierto cuando se está llamando a' command', y como tal la portabilidad de su código se ve afectada. – Jens

Cuestiones relacionadas