2012-03-30 21 views
10

Ok .. Więc prawdopodobnie Przykładem jest dobrym sposobem, aby wyjaśnić ten problemtłumienia druku jak stdout pytona

Więc mam coś takiego:

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

Teraz ten scenariusz jest wywoływana z rubinem skrypt ... i zasadniczo analizuje wynik tam. Ale foobar() ma wiele zapisów dotyczących drukowania .. i stdout wypłukuje wszystkie te odbitki. Czy istnieje sposób (poza rejestrowaniem mathodów) mogę zmodyfikować coś tutaj, co automatycznie tłumi te wydruki i po prostu spłukuje ten wynik? Dzięki

Odpowiedz

17

Chcesz cienie (lub w inny sposób ukryć) tymczasowo. Coś takiego:

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

Musisz przypisać coś, co jest podobny do pliku sys.stdout tak, że inne metody mogą z niego korzystać efektywnie. StringIO jest dobrym kandydatem, ponieważ nie wymaga dostępu do dysku (po prostu gromadzi się w pamięci), a następnie jest odrzucany.

+0

niesamowite .. tylko to, co potrzebne :) – Fraz

+4

A co z użyciem 'sys.stdout = open (os.devnull, 'w')' zamiast 'StringIO()'? – ovgolovin

+0

@ovgolovin - zdecydowanie rozsądne, jeśli nie ma oczekiwań, że możesz potrzebować wyjścia. Dzięki StringIO możesz go odzyskać w razie potrzeby, zanim zresetujesz oryginalną wartość 'stdout'. –

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

z Pythonem 3.4 i maksymalnie można użyć redirect_stdout contextmanager takiego:.

with redirect_stdout(open(os.devnull, "w")): 
    print("This text goes nowhere") 
print("This text gets printed normally")