2012-04-11 71 views
5

我已經成功地找到代碼生成一個vim編輯和創建從python腳本一個臨時文件。該代碼是在這裏,我在這裏找到:call up an EDITOR (vim) from a python scriptvim編輯器在Python腳本臨時文件

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

我遇到的問題是,我無法訪問臨時文件的內容後,我退出編輯器。

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

tempfile.readline() 

我得到

ValueError: I/O operation on closed file 

我所做的:

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

我將如何訪問該文件在Python腳本一旦被編輯與編輯器?

謝謝

回答

5

裏面的東西一個with塊的作用範圍。如果您創建具有with聲明的臨時文件,塊結束後,將不可用。

您需要閱讀的臨時文件內容的with塊內,或使用其他語法創建臨時文件,如:

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

如果你想自動關閉該文件的塊之後,但仍能夠重新打開它,通過delete=FalseNamedTemporaryFile構造函數(否則它會閉幕後刪除):

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

順便說一句,你可能需要使用envoy運行子進程,正冰庫:)

+0

非常感謝您 – Neeran 2012-04-11 10:45:12

2

NamedTemporaryFile創建一個關閉後刪除的文件(docs)。因此,它不適合當你需要寫的東西到一個臨時文件和文件被關閉後,讀取其中的內容。

使用mkstemp代替(docs):

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

我沒不知道「delete = False」(請參閱​​接受的答案)。無論如何,我會留下我的答案,因爲它顯示瞭解決問題的另一種有效方法。 – codeape 2012-04-11 11:36:55

3

我也陷入了同樣的問題,並有同樣的問題。

它只是不覺得自己是一個最好的做法不刪除臨時文件只是這樣,它可以被讀出。我發現下面的方式來閱讀什麼VIM編輯後寫入NamedTempFile的實例,讀它,並保留刪除臨時文件的優勢。 (這不是暫時的,如果它不是對自己刪除的,對不對?)

一個人必須倒回臨時文件,然後讀取它。 我發現在答案: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() 

這是我在腳本中使用的實際代碼: 進口臨時文件 進口OS 從子導入調用

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