2012-04-11 12 views
5

私は、vimエディタの作成とpythonスクリプトからの一時ファイルの作成のためのコードを見つけることに成功しました。コードはここにある、私はここでそれを見つけた:call up an EDITOR (vim) from a python scriptPythonスクリプトtempfileのVimエディタ

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スクリプトでファイルにアクセスする方法は?

withブロック内

答えて

5

すべてはスコープされ、ありがとうございました。 withステートメントを使用してテンポラリファイルを作成すると、ブロックが終了した後で使用できなくなります。

あなたは一時ファイルを作成するためにwithブロック内の一時ファイルの内容を読み取るか、別の構文を使用する必要があり、例えば:

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

あなたは自動的にブロックした後、ファイルを閉じたいならば、まだそれを再オープンすることができ、NamedTemporaryFileコンストラクタ(そうでなければ終了後に削除されます)にdelete=Falseを渡す:

ところで
with tempfile.NamedTemporaryFile(suffix=".tmp", delete=False) as tempfile: 

、あなたはn個、サブプロセスを実行するためにenvoyを使用する場合があります氷ライブラリー)

+0

は非常に私はwasn – Neeran

2

NamedTemporaryFileクローズ後に削除されるファイルが作成されます(docs)。したがって、一時ファイルに何かを書き込む必要がある場合や、ファイルが閉じられた後に内容を読み取る必要がある場合には適していません。

利用代わりmkstempdocs):

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

ありがとうサブプロセスのインポート呼び出しから 輸入一時ファイル 輸入OS :ここ

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

http://pymotw.com/2/tempfile/が、私は私のスクリプトで使用される実際のコードです: 私は、答えを見つけました'' delete = False''を認識していません(受け入れられた答えを見てください)。とにかく問題を解決する別の有効なアプローチを示しているので、私は私の答えを残しておきます。 – codeape

3

私は同じ問題に実行していて、同じ質問がありました。

ちょうどそれが読むことができるように一時ファイルを削除しないことがベストプラクティスのように感じられませんでした。 vimの編集後にNamedTempFileのインスタンスに書き込まれたものを読み込み、読み取って、一時ファイルを削除する利点を保持するには、次の方法があります。 (それ自体が削除されていないと一時的ではありません)

一時ファイルを巻き戻し、それを読み取る必要があります。

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() 
関連する問題