5

私は、vimエディターを生成し、Pythonスクリプトから一時ファイルを作成するためのコードを見つけることに成功しました。コードはここにあります、私はここでそれを見つけました:Pythonスクリプトからエディター(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スクリプトでファイルにアクセスするにはどうすればよいですか?

ありがとうございました

4

3 に答える 3

5

ブロック内のすべてwithがスコープされます。ステートメントを使用して一時ファイルを作成するとwith、ブロックが終了した後は使用できなくなります。

ブロック内の一時ファイルの内容を読み取るwithか、別の構文を使用して一時ファイルを作成する必要があります。例:

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

ブロック後にファイルを自動的に閉じても、再度開くことができる場合delete=Falseは、NamedTemporaryFileコンストラクターに渡します(そうでない場合は、閉じた後に削除されます)。

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

ところで、あなたはサブプロセスを実行するために使節を使用したいかもしれません、素晴らしいライブラリ:)

于 2012-04-11T09:38:35.900 に答える
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()

スクリプトで使用した実際のコードは次のとおりです。 import tempfile import os from subprocess import call

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()
于 2013-11-07T15:03:56.640 に答える
2

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

代わりに使用mkstempします ( docs ):

f, fname = mkstemp(suffix=".tmp")
f.write("...")
f.close()
call([EDITOR, fname])
于 2012-04-11T09:42:53.917 に答える