sys.stdin, sys.stdout și sys.stderr în Python

Interpretorul (sys) Python 3.0+

Fluxurile standard: intrarea, ieșirea normală și ieșirea pentru erori.

Sintaxă
sys.stdin.read() / for rand in sys.stdin: ...
sys.stdout.write(text)
print(mesaj, file=sys.stderr)

Ce face sys.stdin, sys.stdout și sys.stderr

sys.stdin este intrarea standard: tastatura sau datele trimise prin | (cat date.txt | python3 script.py). O poți citi toată (read()) sau rând cu rând. sys.stdout este ieșirea normală, unde scrie print; sys.stderr este pentru mesaje de eroare și diagnostic, care rămân vizibile chiar dacă ieșirea normală este redirecționată într-un fișier.

Toate sunt obiecte fișier text; au write(), flush(), isatty() și atributul buffer pentru acces binar.

Exemple

Exemplul 1: Filtru de text: citește din stdin, scrie în stdout

import sys
total = 0
for rand in sys.stdin:
    if rand.strip().isdecimal():
        total += int(rand)
    else:
        print(f"Ignor: {rand.strip()!r}", file=sys.stderr)
sys.stdout.write(f"Total: {total}\n")

Rezultat (rulat cu: printf ’10\nabc\n32\n’ | python3 suma.py)

Ignor: 'abc'
Total: 42

Exemplul 2: Scriere directă și flush

import sys
sys.stdout.write("fără rând nou")
sys.stdout.write(" | continuare\n")
sys.stdout.flush()
print(sys.stdout.encoding, sys.stdin.readable(), sys.stderr.writable())
sys.stdout.flush()
sys.stdout.buffer.write("octeți: ș\n".encode())

Rezultat

fără rând nou | continuare
utf-8 True True
octeți: ș

Greșeli frecvente

  • Afișezi mesajele de eroare cu print obișnuit; când ieșirea este redirecționată (> rezultat.txt), erorile ajung în fișier și nu le vezi. Folosește file=sys.stderr.

Comenzi înrudite