2012-04-11 39 views
5

Tôi đã thành công trong việc tìm kiếm mã để sinh ra một trình soạn thảo vim và tạo một tempfile từ một kịch bản lệnh python. Mã này là ở đây, tôi thấy nó ở đây: call up an EDITOR (vim) from a python scriptTrình biên tập Vim trong kịch bản python 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]) 

Vấn đề tôi gặp là tôi không thể truy cập vào các nội dung của tempfile sau khi tôi bỏ trình soạn thảo.

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

tempfile.readline() 

tôi nhận được

ValueError: I/O operation on closed file 

tôi đã làm:

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

Làm thế nào tôi có thể truy cập các tập tin trong một kịch bản python khi nó đã được chỉnh sửa với trình biên tập?

Cảm ơn bạn

Trả lời

5

Tất cả mọi thứ bên trong một khối with được scoped. Nếu bạn tạo tệp tạm thời bằng câu lệnh with, nó sẽ không có sẵn sau khi khối kết thúc.

Bạn cần phải đọc nội dung tempfile bên trong khối with, hoặc sử dụng cú pháp khác để tạo ra các tập tin tạm thời, ví dụ:

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

Nếu bạn muốn tự động đóng các tập tin sau khi khối của bạn, nhưng vẫn có thể mở lại nó, vượt qua delete=False đến NamedTemporaryFile constructor (nếu không nó sẽ bị xóa sau khi đóng cửa):

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

Btw, bạn có thể muốn sử dụng envoy để chạy trình con, n thư viện băng :)

+0

Thank you very much – Neeran

2

NamedTemporaryFile tạo tệp bị xóa sau khi đóng (docs). Do đó, không thích hợp khi bạn cần viết một cái gì đó vào một tệp tạm thời và đọc nội dung sau khi tệp được đóng lại.

Sử dụng mkstemp thay vì (docs):

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

Tôi wasn 't nhận thức '' xóa = False'' (xem câu trả lời được chấp nhận). Tôi sẽ để lại câu trả lời của tôi anyway, vì nó cho thấy một cách tiếp cận hợp lệ để giải quyết vấn đề. – codeape

3

tôi đã chạy vào cùng một vấn đề và có cùng một câu hỏi.

Nó chỉ không cảm thấy như một thực hành tốt nhất để không xóa một tập tin tạm thời chỉ để nó có thể được đọc. Tôi tìm thấy cách sau đây để đọc những gì đã được viết cho một thể hiện của một NamedTempFile sau khi chỉnh sửa vim, đọc nó, và giữ lại lợi thế của việc xóa tempfile. (Nó không phải là tạm thời nếu nó không bị xóa một mình, đúng không ?!)

Người ta phải tua lại tempfile và sau đó đọc nó. Tôi tìm thấy câu trả lời tại: 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() 

Đây là mã thực tế tôi sử dụng trong kịch bản của tôi: nhập khẩu tempfile import os từ cuộc gọi nhập subprocess

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() 
Các vấn đề liên quan