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()




subject:
  ( 112 subscribers )