Tulostusvirta viittaa tiedon välitykseen tietokoneessa sovelluksen, tiedostojen jne. välillä. Funktiot print ja input lähettävät tämmöisiä virtoja sovelluksen ja konsoli-ikkunan välillä ja tiedosto-objektit sovelluksen ja tiedostojen välillä. Itseasiassa funktiot print ja input käyttävät sisäänrakennettuja tiedosto-objekteja toimintaansa.
Joskus voi olla hyödyllistä muuttaa näitä tiedosto-objekteja tiedon välittämiseksi haluttuun kohteeseen. Modulista sys löytyy kolme tiedosto-objektia; stdout, johon print funktio kirjoittaa ja stdin, josta input funktio lukee käyttäjän antaman syötteen. Kolmas on stderr, johon virhe ilmoitukset kirjoitetaan.
Ohjelman kaatuessa virheeseen (ainakin windowsissa ohjelmia ajettaessa), virhe kyllä tulostetaan näytölle, mutta ikkuna suljetaan välittömästi. IDLE-editorissa ajettaessa virhe ilmoitukset tulostetaan punaisella tekstillä. Korvaamalla stderr tiedosto-objektilla saadaan virhe ilmoitus ohjattua tiedostoon.
Myös stdout on vaihdettavissa niin, että funktion print avulla tulostettu teksti kirjoitetaankin konsoli-ikkunan sijasta tiedostoon. Tämä onnistuu myös välittämällä print funktiolle sitä kutsuttaessa parametri stream, joka määrittää mihin tiedosto-objektiin tulostus tapahtuu - parametrin vakioarvo on luonnollisesti stdout. Funktion input tulostama tekstikin menee tiedostoon.
Code Block |
---|
import sys logfile = open("log.txt", "w") print("Tulostus parametrin avulla tiedostoon.", file=logfile) sys.stdout = logfile print("Tulostus tiedostoon korvaamalla stdout.") input("Paina Enter-näppäintä lopettaaksesi...") logfile.close() |
Tälläinen tulosteen uudelleenohjaus voi olla hyödyllistä toteutettaessa erilaisia loki tiedostoja. Tälläisiin teidostoihin voidaan tallentaa ajon aikana tietoa ja ongelmien esiintyessä ohjelmaa käytettäessä loki tiedostoa tarkastelemalla voidaan tutkia mikä ongelmat mahdollisesti aiheuttaa.
Funktio input ei kirjoita tietoa vaan lukee. Tämän takia korvaamalla stdin, jollain tiedostolla, voidaan automatisoida ohjelmaan kirjoitettavaa syöte. Tässä vielä siitä esimerkki.
Code Block |
---|
import sys scriptfile = open("script.txt", "r") sys.stdin = scriptfile a = input("Anna numero: ") b = input("Anna toinen numero: ") print("Numeroiden tulo on %s" % (int(a) * int(b))) input("Paina Enter-näppäintä lopettaaksesi...") |
Tämä on hyödyllistä, jos halutaan esimerkiksi testata jonkun ohjelman toimintaa. Testaus on paljon nopeampaa kun syötteen tekeminen ohjelmalle tapahtuu automaattisesti sen sijaan, että jokaisella testi kerralla syöte kirjoitettaisiin käsin.
Tulosteiden uudelleenohjauksella on toki monia muita käyttökohteita. Pythonin dynaamisuuden takia, tiedosto-objektiksi käy mikä tahansa olio, jolla on metodit read ja write. Sisäänrakennetuista muuttuja tyypeistä lähinnä vain tiedosto-objekteilla on nämä metodit, mutta Pythonissa voi määritellä omia luokkia ja niille metodeja, jolloin tulosteiden uudelleen ohjausta voi hyödyntää paljon monipuolisemmin.