V některých případech se může hodit zachytávat standardní výstup a místo do konzoly (na obrazovku) jej zapisovat do souboru.
Jednoduché přesměrování výstupu do souboru
Příklad:
import sys
soubor = open("access.log","a")
sys.stdout = soubor
print "Tento text se nevypíše na obrazovku ale do souboru access.log"
soubor.close()
sys.stdout=sys.__stdout__
Přesměrování do streamu
Některé aplikace mohou využít přesměrovaný výstup jiným způsobem než prostým zápisem do logovacího souboru. Výstup může být uložen v databázi, dále zpracováván apod. Pro takové úlohy se používá StringIO? resp. cStringIO objekt.
Příklad:
""" Ukazka presmerovani standardniho vystupu skriptu do IO streamu.
cStringIO zde pouzivam, protoze je rychlejsi nez klasicky StringIO,
kteryzto lze ale dedit apod. Doporucuji ke studiu dokumentaci - kap. 4.
"""
import cStringIO
import sys
cout = cStringIO.StringIO()
sys.stdout = cout
# analogicky napr. sys.stderr = cout # nebo jiny stream
sys.stderr = cout
try:
# simulace vystupu
for i in range(10):
print 'Naprosto zasadni vystup: %s' % i
# simulace chyby
print 'A ted neco naprosto jineho - skript s umele vyvolanou vyjimkou!'
try:
raise ValueError
except:
# Abych dostal do vystupu i "chybovou hlasku" musim v tomto pripade
# pouzit modul traceback
import traceback
traceback.print_exc()
finally:
# vratim puvodni stream, takze odtud uz vse jde rouvnou na vystup
sys.stdout = sys.__stdout__
sys.stdout = sys.__stderr__
# Se streamem ted muzu delat psi kusy.
# Treba zapsat standardne do souboru (coz si za domaci
# ukol proti chybam osetri kazdy sam)...
f = open('output.log', 'w')
f.write(cout.getvalue())
f.close()
# ... anebo jej vypsat na vystup pozdeji...
print cout.getvalue()
# ... anebo spocitat jeho velikost (delku)
print 'Delka retezce: %s ' % len(cout.getvalue())
# a treba ruzne parsovat atd. atd.
cout.close()