2011-12-07 16 views
5

मैं एक फाइल करने के लिए अजगर कोड का एक हिस्सा के एसटीडी उत्पादन प्रवेश करना चाहते हैं '' के साथ अजगर का उपयोग कर फ़ाइल लॉग इन करने, का उपयोग करते हुए बयान 'के साथ':लॉगिंग stdout और stderr बयान

with log_to_file('log'): 
    # execute code 

सबसे आसान है जिस तरह से इस मैन्युअल log_to_file परिभाषित करने के लिए ऐसा करने के लिए, जैसे:

import sys 

class log_to_file(): 
    def __init__(self, filename): 
     self.f = open(filename, 'wb') 

    def __enter__(self): 
     self.stdout = sys.stdout 
     self.stderr = sys.stderr 
     sys.stdout = self.f 
     sys.stderr = self.f 

    def __exit__(self, type, value, traceback): 
     sys.stdout = self.stdout 
     sys.stderr = self.stderr 

या वहाँ एक अंतर्निहित वर्ग कि यह पहले से ही कर सकते हैं?

+0

पर एक नजर डालें [इस] (http://stackoverflow.com/questions/616645/how-do-i-duplicate-sys-stdout-to-a-log-file-in-python) सवाल। ऐसा लगता है कि आप क्या खोज रहे हैं। ध्यान दें कि उत्तरों में से एक मौजूदा लॉगिंग मॉड्यूल का उपयोग करता है, जबकि अन्य मल्टीप्रोसेसिंग का उपयोग करते हैं। – thegrinner

+1

आपका दृष्टिकोण अच्छा है, भले ही आप '__exit__'' पर फ़ाइल बंद करना याद रखें :) मुझे यह पसंद है। – tito

+1

आप किस तरह के उत्तर की उम्मीद करते हैं? मैं इसे एक टिप्पणी के रूप में दूंगा: नहीं, कोई अंतर्निहित कक्षा नहीं है जो ऐसा करती है। –

उत्तर

2

केवल एक चीज मैं सुझाव सकता contextmanager डेकोरेटर का उपयोग करना है, लेकिन मैं आश्वस्त नहीं हूँ यह वास्तव में बेहतर है।

from contextlib import contextmanager 
@contextmanager 
def stdouterrlog(logfile): 
    with open(logfile, 'wb') as lf: 
    stdout = sys.stdout 
    stderr = sys.stderr 
    sys.stdout = lf 
    sys.stderr = lf 
    yield lf # support 'with stdouterrlog(x) as logfile' 
    sys.stdout = stdout 
    sys.stderr = stderr 
+0

' file' के संदर्भ प्रबंधक निहित का उपयोग क्यों नहीं वस्तुओं? यही कारण है कि है, 'के शरीर हो stdouterrlog'' है खुला साथ (लॉगफ़ाइल, 'पश्चिम बंगाल') लॉगफ़ाइल के रूप में है: \ n (sys.stdout चीजें करते ...) \ N उपज logfile' \ n (sys.stdout सामान पूर्ववत। ..) – detly

+0

हाँ, यह एक अतिरिक्त पंक्ति की बचत होगी। – wberry

+1

... को छोड़कर आप शायद भी पूरी बात एक 'try' /' finally' ब्लॉक भी में लिपटे होना चाहिए कि, नहीं तो एक बिना क्रिया त्रुटि लॉग फ़ाइल खुला छोड़ देंगे। – detly

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