2012-04-11 12 views
5

में विम संपादक मैं एक विम संपादक को बनाने और एक अजगर लिपि से एक टेम्पफाइल बनाने के लिए कोड खोजने में सफल रहा हूं। कोड यहाँ है, मैं इसे यहाँ पाया: call up an EDITOR (vim) from a python scriptपायमॉन स्क्रिप्ट 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]) 

समस्या मैं कर रहा हूँ कि मैं के बाद मैं संपादक से बाहर निकलें tempfile की सामग्री का उपयोग नहीं कर सकता है।

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 सामग्री पढ़ने, या किसी अन्य सिंटैक्स का उपयोग करने के लिए अस्थायी फ़ाइल बनाने की आवश्यकता है, जैसे:

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

आप स्वचालित रूप से अपने ब्लॉक के बाद फ़ाइल को बंद करना चाहते हैं, लेकिन अभी भी फिर से खुल करने के लिए यह, NamedTemporaryFile निर्माता (वरना यह समापन के बाद हटा दिया जाएगा) को delete=False पारित सक्षम हो:

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

Btw, आप subprocesses चलाने के लिए envoy का उपयोग करना चाहें, एन बर्फ पुस्तकालय :)

+0

आपको बहुत बहुत – Neeran

2

NamedTemporaryFile एक फ़ाइल बनाता है जो इसे बंद होने के बाद हटा दिया जाता है (docs)। इसलिए जब आप किसी temp फ़ाइल में कुछ लिखने की आवश्यकता होती है और फ़ाइल बंद होने के बाद सामग्री को पढ़ने की आवश्यकता होती है तो यह उपयुक्त नहीं है।

उपयोग mkstemp बजाय (docs):

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

मैं wasn धन्यवाद उपप्रक्रिया आयात कॉल से आयात tempfile आयात ओएस : 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() 

यहाँ वास्तविक कोड मैं अपने स्क्रिप्ट में प्रयोग किया है: मैं कम से जवाब मिला 'हटाना = गलत 'के बारे में पता नहीं है (स्वीकृत उत्तर देखें)। मैं वैसे भी अपना जवाब छोड़ दूंगा, क्योंकि यह समस्या को हल करने के लिए एक और वैध दृष्टिकोण दिखाता है। – codeape

3

मैं एक ही समस्या में चल रहा है और एक ही सवाल था।

यह सिर्फ एक अस्थायी फ़ाइल को हटाने के लिए सबसे अच्छा अभ्यास नहीं लग रहा था ताकि इसे पढ़ा जा सके। मुझे संपादन करने के बाद नामांकित टेम्पम्फाइल के उदाहरण के लिए लिखा गया था, इसे पढ़ने के लिए, और टेम्पफाइल को हटाने का लाभ बरकरार रखने के बाद निम्नलिखित तरीके को पढ़ने का तरीका मिला। (यह अस्थायी नहीं है अगर इसे अपने आप हटाया नहीं गया है, है ना??)

किसी को 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() 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^