Hoe controleer ik of stdin gegevens heeft?

Hoe controleer je in Python of sys.stdingegevens heeft of niet?

Ik ontdekte dat os.isatty(0)niet alleen kan controleren of stdin is aangesloten op een TTY-apparaat, maar ook of er gegevens beschikbaar zijn.

Maar als iemand code gebruikt zoals

sys.stdin = cStringIO.StringIO("ddd")

en daarna os.isatty(0)gebruikt, geeft het nog steeds True terug. Wat moet ik doen om te controleren of stdin gegevens heeft?


Antwoord 1, autoriteit 100%

Op Unix-systemen kunt u het volgende doen:

import sys
import select
if select.select([sys.stdin, ], [], [], 0.0)[0]:
    print("Have data!")
else:
    print("No data")

In Windows mag de select-module echter alleen met sockets worden gebruikt, dus u moet een alternatief mechanisme gebruiken.


Antwoord 2, autoriteit 89%

Ik gebruik

if not sys.stdin.isatty()

Hier is een voorbeeld:

import sys
def main():
    if not sys.stdin.isatty():
        print "not sys.stdin.isatty"
    else:
        print "is  sys.stdin.isatty"

Hardlopen

$ echo "asdf" | stdin.py
not sys.stdin.isatty

sys.stdin.isatty()retourneert false als stdinniet is verbonden met een interactief invoerapparaat (bijvoorbeeld een tty).

isatty(...)
    isatty() -> true or false. True if the file is connected to a tty device.

Antwoord 3, autoriteit 5%

Afhankelijk van het doel hier:

import fileinput
for line in fileinput.input():
    do_something(line)

kan ook handig zijn.


Antwoord 4, autoriteit 3%

Zoals anderen al zeiden, is er geen onfeilbare manier om te weten of gegevens beschikbaar komen van stdin, omdat UNIX dit niet toestaat (en meer in het algemeen omdat het het toekomstige gedrag van welk programma dan ook waarmee stdin verbinding maakt niet kan raden).

Wacht altijd op stdin, zelfs als er niets is (dat is wat grepetc. doet), of vraag de gebruiker om een ​​-argument.


Antwoord 5

Ik heb hierboven veel antwoorden gezien, waarin bijna alle antwoorden sys, select, os, enz. vereisten. Ik kreeg echter een heel eenvoudig idee over hoe ik continu invoer van stdin moet ontvangen als het gegevens heeft.
We kunnen try gebruiken, behalve block om dit te doen.
als,

while(1):
  try:
    inp = input()
  except:
     break

De bovenstaande lus wordt uitgevoerd en we controleren continu op invoer en slaan de invoer op in variabele “inp”, als er geen invoer in de stdin is, dan zal proberen een foutmelding geven, behalve dat de instructie block break aanwezig is, dus de while-lus wordt beëindigd


Antwoord 6

Met behulp van ingebouwde modules kan dit worden bereikt met de volgende code zoals Gregg gaf al het idee:

import fileinput
isStdin = True
for line in fileinput.input:
    # check if it is not stdin
    if not fileinput.isstdin():
        isStdin = False
        break
    # continue to read stdin
    print(line)
fileinput.close()

Other episodes