86 votes

Comment vérifier si stdin a des données?

En Python, comment vérifier si sys.stdin contient des données ou non?

J'ai trouvé que os.isatty(0) peut non seulement vérifier si stdin est connecté à un appareil TTY, mais aussi si des données sont disponibles.

Mais si quelqu'un utilise un code tel que

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

et après cela utilise os.isatty(0) , il renvoie toujours True. Que dois-je faire pour vérifier si stdin contient des données?

92voto

Rakis Points 5040

Sur les systèmes Unix, vous pouvez effectuer les opérations suivantes:

 import sys
import select

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

Sous Windows, le module de sélection ne peut être utilisé qu'avec des sockets, vous devrez donc utiliser un mécanisme alternatif.

88voto

symphonyblade Points 342

J'ai utilisé

 if not sys.stdin.isatty()

Voici un exemple:

 import sys

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

En cours

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

sys.stdin.isatty() renvoie faux si stdin n'est pas connecté à un périphérique d'entrée interactif (par exemple un tty).

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

4voto

Gregg Lind Points 6905

En fonction de l'objectif ici:

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

peut également être utile.

4voto

n.caillou Points 696

(modifier: Cela répond à une question connexe qui a depuis été fusionnée ici.)

Comme mentionné par d'autres, il n'y a pas de moyen infaillible de savoir si les données seront disponibles à partir de stdin, car UNIX ne le permet pas (et plus généralement parce qu'il ne peut pas deviner le comportement futur du programme auquel stdin se connecte).

Attendez toujours stdin, même s'il n'y a rien (c'est ce que fait grep etc.), ou demandez à l'utilisateur un argument -

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X