| 1 | ||
|
Editor: s0
Time: 2005/09/22 18:04:11 GMT+0 |
||
| Note: | ||
changed: - 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()
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.
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__
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()