web-dev-qa-db-fra.com

Comment puis-je vérifier si stdin a des données?

En Python, comment vérifiez-vous si sys.stdin A 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 s'il y a des données disponibles.

Mais si quelqu'un utilise du code tel que

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

et après avoir utilisé os.isatty(0), il retourne toujours True. Que dois-je faire pour vérifier si stdin a des données?

51
mlzboy

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 devez donc utiliser un mécanisme alternatif.

64
Rakis

J'utilise

if not sys.stdin.isatty()

Voici un exemple:

4 import sys
5
6 def main():
7     if not sys.stdin.isatty():
8         print "not sys.stdin.isatty"
9     else:
10         print "is  sys.stdin.isatty"

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

sys.stdin.isatty () renvoie false s'il y a quelque chose dans stdin.

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

Selon l'objectif ici:

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

peut également être utile.

2
Gregg Lind

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

Comme mentionné par d'autres, il n'y a aucun moyen infaillible de savoir si les données deviendront 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 de tout programme auquel stdin se connecte).

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

2
n.caillou