2011-12-07 28 views
5

Tôi muốn đăng nhập đầu ra std của một đoạn mã Python vào một tập tin, sử dụng 'với' tuyên bố:Logging stdout và stderr để đăng nhập tập tin sử dụng Python 'với' tuyên bố

with log_to_file('log'): 
    # execute code 

là dễ nhất cách để thực hiện việc này để xác định thủ công log_to_file, ví dụ:

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 

hoặc có lớp tích hợp sẵn có thể làm điều này chưa?

+0

Hãy xem [this] (http://stackoverflow.com/questions/616645/how-do-i-duplicate-sys-stdout-to-a-log-file-in-python) câu hỏi. Nó có vẻ như những gì bạn đang tìm kiếm. Lưu ý một trong các câu trả lời sử dụng mô đun ghi nhật ký hiện có, trong khi các câu trả lời khác sử dụng đa xử lý. – thegrinner

+1

Cách tiếp cận của bạn là tốt đẹp, ngay cả khi bạn bỏ lỡ để đóng tập tin trên '__exit__' :) Tôi thích nó. – tito

+1

Bạn mong đợi loại câu trả lời nào? Tôi sẽ cung cấp cho nó như là một bình luận: Không, không có lớp được xây dựng trong đó làm điều đó. –

Trả lời

2

Điều duy nhất tôi có thể đề xuất là sử dụng trang trí contextmanager nhưng tôi không tin điều này thực sự tốt hơn.

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

Tại sao không sử dụng trình quản lý ngữ cảnh vốn có cho' tệp' các đối tượng? Tức là, có phần thân của 'stdouterrlog' là' với open (logfile, 'wb') như logfile: \ n (làm sys.stdout stuff ...) \ n mang lại logfile' \ n (undo sys.stdout stuff. ..) – detly

+0

Vâng, điều đó sẽ tiết kiệm thêm một dòng. – wberry

+1

... ngoại trừ việc bạn có lẽ cũng nên có toàn bộ thứ được gói trong một khối 'try' /' finally', nếu không một lỗi chưa được giải quyết sẽ để lại tệp nhật ký mở. – detly

Các vấn đề liên quan