2012-04-11 5 views
5

Ich habe erfolgreich Code zum Erstellen eines vim-Editors und Erstellen einer temporären Datei aus einem Python-Skript gefunden. Der Code ist hier, fand ich es hier: call up an EDITOR (vim) from a python scriptVim Editor im Python-Skript 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]) 

Das Problem, das ich ist, dass ich nicht den Inhalt der temporären Datei zugreifen kann, nachdem ich den Editor verlassen.

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

tempfile.readline() 

ich

ValueError: I/O operation on closed file 

ich getan habe:

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

Wie würde ich die Datei in einem Python-Skript zugreifen, sobald es mit dem Editor bearbeitet wurde?

Danke

Antwort

5

Alles innerhalb with Block scoped ist. Wenn Sie die temporäre Datei mit der Anweisung with erstellen, ist sie nach dem Ende des Blocks nicht verfügbar.

Sie müssen die temporären Dateien zum Inhalt innerhalb des with Block lesen oder eine andere Syntax verwenden, die temporäre Datei zu erstellen, zB:

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

Wenn Sie die Datei automatisch nach dem Block, aber immer noch wollen, um schließen der Lage sein, wieder zu öffnen, verarbeiten, delete=False zum NamedTemporaryFile Konstruktor (sonst wird es nach dem Schließen gelöscht werden):

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

Btw, möchten Sie vielleicht envoy verwenden Subprozesse zu laufen, n Eisbibliothek :)

+0

Danke – Neeran

2

NamedTemporaryFile erstellt eine Datei, die nach dem Schließen gelöscht wird (docs). Es ist daher nicht geeignet, wenn Sie etwas in eine temporäre Datei schreiben müssen und den Inhalt lesen, nachdem die Datei geschlossen wurde.

Verwenden mkstemp statt (docs):

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

sehr viel ich wasn "delete = False" ist nicht bekannt (siehe die akzeptierte Antwort). Ich werde meine Antwort trotzdem hinterlassen, da es einen anderen gültigen Ansatz zur Lösung des Problems zeigt. – codeape

3

Ich lief in das gleiche Problem und hatte die gleiche Frage.

Es fühlte sich einfach nicht an, eine temporäre Datei NICHT zu löschen, nur damit sie gelesen werden konnte. Ich habe den folgenden Weg gefunden, um zu lesen, was nach vim-Bearbeitung in eine Instanz einer NamedTempFile geschrieben wurde, lese es und behalte den Vorteil, die Tempdatei zu löschen. (Es ist nicht temporär, wenn es nicht allein gelöscht wird, oder ?!)

Man muss die Tempdatei zurückspulen und dann lesen. fand ich die Antwort auf: 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() 

Hier ist der eigentliche Code, den ich in meinem Skript verwendet: Import tempfile import os von subprocess Importaufruf

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()