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?
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.
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.
Selon l'objectif ici:
import fileinput
for line in fileinput.input():
do_something(line)
peut également être utile.
(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.