2012-04-11 2 views
5

나는 vim 편집기를 생성하고 파이썬 스크립트에서 임시 파일을 작성하는 코드를 찾는데 성공했습니다. 코드는 여기에, 난 여기가 발견 call up an EDITOR (vim) from a python script파이썬 스크립트 임시 파일에서 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' 

그것이 편집기로 편집되고 나면 내가 파이썬 스크립트 파일에 액세스 할 어떻게? with 블록 범위가 내부

당신에게

답변

5

모두 감사드립니다. with 문을 사용하여 임시 파일을 만들면 블록이 끝난 후에는 사용할 수 없습니다.

당신은 임시 파일을 생성하기 위해 with 블록 내부의 임시 파일 내용을 읽거나 다른 구문을 사용합니다, 예를 들면 :

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

당신이 자동으로 차단 후 파일을 닫아야 할 경우, 여전히 그것은 다시 열고 (다른이 폐쇄 후 삭제됩니다)를 NamedTemporaryFile 생성자에 delete=False을 전달할 수 : Btw는

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

, 당신은 서브 프로세스를 실행하는 데 envoy를 사용하려면, N 수 얼음 라이브러리 :)

+0

매우 내가 년후 – Neeran

2

NamedTemporaryFile은 닫힌 후에 삭제 된 파일을 만듭니다 (docs). 따라서 임시 파일에 내용을 쓰고 파일을 닫은 후 내용을 읽어야하는 경우에는 적합하지 않습니다.

사용 mkstemp 대신 (docs) :

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의 인스턴스에 쓰여진 내용을 읽거나 읽은 다음 tempfile을 삭제하는 이점을 유지하기 위해 다음과 같은 방법을 찾았습니다.

하나를 읽을 다음 임시 파일을 되감기해야합니다 (그 자체에서 삭제되어 있지 않은 경우는?! 바로, 일시적 아니다).

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() 
관련 문제