2012-04-11 7 views
5

He tenido éxito en la búsqueda de código para generar un editor vim y la creación de un archivo temporal de un script python. El código está aquí, lo encontré aquí: call up an EDITOR (vim) from a python scriptVim Editor en python script tempfile

import sys, tempfile, os 
from subprocess import call 

EDITOR = os.environ.get('EDITOR','vim') 

initial_message = "" 

with tempfile.NamedTemporaryFile(suffix=".tmp") as tempfile: 
    tempfile.write(initial_message) 
    tempfile.flush() 
    call([EDITOR, tempfile.name]) 

El problema que tiene es que no puedo acceder a los contenidos del archivo temporal después de que salga del editor.

tempfile 
<closed file '<fdopen>', mode 'w+b' at 0x87c47b0> 

tempfile.readline() 

consigo

ValueError: I/O operation on closed file 

que hice:

myfile = open(tempfile.name) 
IOError: [Errno 2] No such file or directory: '/tmp/tmp7VKzfl.tmp' 

¿Cómo podría acceder al archivo en un script en Python, una vez que ha sido editado con el editor?

Gracias

Respuesta

5

Todo dentro de un bloque está en el ámbito with. Si crea el archivo temporal con la declaración with, no estará disponible después de que finalice el bloque.

es necesario leer el contenido de archivo temporal dentro del bloque with, o utilizar otra sintaxis para crear el archivo temporal, por ejemplo:

tempfile = NamedTemporaryFile(suffix=".tmp") 
# do stuff 
tempfile.close() 

Si desea cerrar automáticamente el archivo después de su bloque, pero aún ser capaz de volver a abrirlo, pasar a la delete=FalseNamedTemporaryFile constructor (de lo contrario se eliminará después del cierre):

with tempfile.NamedTemporaryFile(suffix=".tmp", delete=False) as tempfile: 

por cierto, es posible que desee utilizar envoy ejecutar subprocesos, n biblioteca de hielo :)

+0

Muchas gracias – Neeran

2

NamedTemporaryFile crea un archivo que se elimina después de que se cierra (docs). Por lo tanto, no es adecuado para cuando necesita escribir algo en un archivo temporal y leer el contenido una vez que se cierra el archivo.

Uso mkstemp lugar (docs):

f, fname = mkstemp(suffix=".tmp") 
f.write("...") 
f.close() 
call([EDITOR, fname]) 
+0

No estaba 't consciente de '' delete = False'' (ver la respuesta aceptada). Dejaré mi respuesta de todos modos, ya que muestra otro enfoque válido para resolver el problema. – codeape

3

Yo estaba corriendo en el mismo problema y tenía la misma pregunta.

Simplemente no se sentía como una buena práctica NO borrar un archivo temporal solo para poder leerlo. Encontré la siguiente manera para leer lo que se escribió en una instancia de NamedTempFile después de la edición de vim, leerlo y conservar la ventaja de eliminar el archivo temporal. (No es temporal si no se elimina por sí mismo, ¿no ?!)

Uno debe rebobinar el archivo temporal y luego leerlo. he encontrado la respuesta en: http://pymotw.com/2/tempfile/

import os 
import tempfile 
from subprocess import call 

temp = tempfile.TemporaryFile() 
try: 
    temp.write('Some data') 
    temp.seek(0) 

    print temp.read() 
finally: 
    temp.close() 

Aquí es el código real que utilicé en mi guión: importación tempfile OS importación del subproceso llamada de importación

EDITOR = os.environ.get('EDITOR', 'vim') 
initial_message = "Please edit the file:" 

with tempfile.NamedTemporaryFile(suffix=".tmp") as tmp: 
    tmp.write(initial_message) 
    tmp.flush() 
    call([EDITOR, tmp.name]) 
    #file editing in vim happens here 
    #file saved, vim closes 
    #do the parsing with `tempfile` using regular File operations 
    tmp.seek(0) 
    print tmp.read() 
Cuestiones relacionadas