2012-03-30 27 views
10

Ok .. Vì vậy, có thể là một ví dụ là một cách tốt để giải thích vấn đề nàyđàn áp in như stdout python

Vì vậy, tôi có một cái gì đó như thế này:

if __name__=="__main__" 
    result = foobar() 
    sys.stdout.write(str(result)) 
    sys.stdout.flush() 
    sys.exit(0) 

Bây giờ kịch bản này đã được gọi từ một viên hồng ngọc script .. và về cơ bản nó phân tích kết quả ở đó. Nhưng foobar() có rất nhiều bản in .. và stdout flushes tất cả các bản in là tốt. Có cách nào (ngoài việc ghi nhật ký toán học) tôi có thể sửa đổi điều gì đó ở đây để tự động loại bỏ các bản in đó và chỉ xóa kết quả này không ?? Cảm ơn

Trả lời

17

Bạn muốn ẩn (tạm thời ẩn) tạm thời. Một cái gì đó như thế này:

actualstdout = sys.stdout 
sys.stdout = StringIO() 
result = foobar() 
sys.stdout = actualstdout 
sys.stdout.write(str(result)) 
sys.stdout.flush() 
sys.exit(0) 

Bạn cần chỉ định thứ gì đó giống như sys.stdout để các phương pháp khác có thể sử dụng hiệu quả. StringIO là một ứng cử viên tốt vì nó không yêu cầu truy cập đĩa (nó sẽ chỉ thu thập trong bộ nhớ) và sau đó được loại bỏ.

+0

tuyệt vời .. chỉ là những gì tôi cần :) – Fraz

+4

Điều gì về việc sử dụng 'sys.stdout = open (os.devnull, 'w')' thay vì 'StringIO()'? – ovgolovin

+0

@ovgolovin - chắc chắn hợp lý là tốt nếu không có kỳ vọng bạn có thể cần đầu ra. Với StringIO bạn có thể lấy nó nếu cần thiết trước khi bạn đặt lại giá trị gốc của 'stdout'. –

1

This link shows how to redirect stdout in python. Chuyển hướng nó đến một đường ống bên trong, sau đó đọc đường ống của bạn và lọc ra các đường không mong muốn. Điều đó sẽ cho phép bạn giữ chỉ các dòng bạn quan tâm đến

3
import sys 

class output: 
    def __init__(self): 
     self.content = [] 
    def write(self, string): 
     self.content.append(string) 


if __name__=="__main__": 

    out = output()     
    sys.stdout = out     #redirecting the output to a variable content 

    result = foobar() 
    sys.stdout.write(str(result)) 
    sys.stdout.flush() 

    sys.stdout = sys.__stdout__  #redirecting the output back to std output 
    print "o/p of foo :",out.content 

    sys.exit(0) 
6

Với Python 3.4 và lên bạn có thể sử dụng contextmanager redirect_stdout như thế này:.

with redirect_stdout(open(os.devnull, "w")): 
    print("This text goes nowhere") 
print("This text gets printed normally") 
Các vấn đề liên quan