Comment puis-je vérifier si stdin certaines données?
En Python, comment voulez-vous vérifier si sys.stdin
a des données ou pas?
J'ai trouvé que os.isatty(0)
pouvez non seulement vérifier si stdin est connecté à un appareil TTY, mais aussi s'il existe des données disponibles.
Mais si quelqu'un utilise un code tel que
sys.stdin = cStringIO.StringIO("ddd")
et après qui utilise os.isatty(0)
, il renvoie toujours Vrai. Que dois-je faire pour vérifier si stdin a données?
- qu'est-ce exactement que vous voulez atteindre ?
- Que se passe parce que
os.isatty(0)
vérifie si le fichier associé au descripteur de fichier (fd) 0 est un TTY. Lorsque vous modifiez lesys.stdin
variable, vous ne modifiez pas le fichier associé à fd0. fd0 pointe toujours à l'origine de stdin (qui est un ATS dans votre cas). - Vérifier cette réponse. Il ne se rapportent à votre question?
- Ciupitu,vous avez raison,j'utilise sys.stdin=cStringIO.Chaîne de caractères("ddd") pour la redirection de l'entrée standard stdin,ce que je veux, c'est comment vérifier sys.stdin est de les avoir données,si j'utilise sys.stdin.read() directement, il bloquera les dessous de chose et d'attendre toujours si aucune entrée n'donné
- Je ne vois pas en quoi la lecture de
cStringIO.StringIO("ddd")
pourrait bloquer; il a toujours les données disponibles, sauf lorsque EOF est atteint de cours. - stackoverflow.com/questions/3762881/...
- Il serait intéressant de savoir comment vous l'avez trouvé que
os.isatty(0)
pouvez non seulement vérifier si stdin est connecté à un appareil TTY, mais aussi s'il existe des données disponibles.
Vous devez vous connecter pour publier un commentaire.
Sur les systèmes Unix, vous pouvez effectuer les opérations suivantes:
Sur le Windows sélectionnez le module peut être utilisé uniquement avec les sockets mais si vous avais besoin d'utiliser un autre mécanisme.
select
qui appelle le système d'exploitation de la fonction de sélection peut fonctionner qu'avec ces fichiers.StringIO
est un fichier virtuel connu seulement de l'interpréteur Python, par conséquent, elle n'a pas un descripteur de fichier et que vous ne pouvez pas utiliserselect
sur elle.sys.stdin.isatty()
cependant fait un travail pour moi dans cron.<_io.TextIOWrapper name='<stdin>' mode='r' encoding='UTF-8'>
et pas[]
/dev/null
comme stdin, sélectionnez.sélectionnez les retourner immédiatement. C'est le cas lors de l'exécution du script via cron ou d'autres outils. Le moyen le plus facile de reproduire ce comportement est d'ajouter< /dev/null
sur la ligne de commande.sys.stdin
a des données qui sont immédiatement disponible. Et je ne pense pas que c'est strictement garanti, même lorsqu'il est connecté à un fichier (par exemple, que s'il est connecté à un fichier sur un NFS et la connexion réseau sous-jacente est inégale?).select
est destiné pour le multiplexage, c'est à dire le choix de ce qui est prêt à lecture/écriture à partir de plusieurs sources/destinations.J'ai été en utilisant
Voici un exemple:
sys.stdin.isatty() retourne false si il y a quelque chose dans stdin.
select
.grep
est mentionné dans un autre post, je vais mentionner queless
utiliseisatty
. Je suis venu ici chercher à faire quelque chose commeless
: lire l'entrée à partir d'un fichier si un chemin d'accès au fichier est donné comme argument d'entrée, mais lisez l'entrée stdin autrement. Une alternative est d'utiliser-
comme un alias pour stdin et accepter le fichier argument.En fonction de l'objectif ici:
peut également être utile.
(edit: Ceci répond à une question connexe, qui a depuis été regroupées 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, parce qu'UNIX ne le permet pas (et, plus généralement, parce qu'il ne peut pas deviner l'avenir le comportement de ce programme stdin est connecté).
Toujours attendre pour stdin, même si il n'y a rien (c'est ce que
grep
etc. le faire), ou demander à l'utilisateur un-
argument.printf "" | cat
ouwhile read l; do true; done; echo finishing
(dans le second cas, vous devez entrer des expressions du FOLKLORE et^D manuellement à traverser)cat
sur la ligne de commande, il va attendre d'entrée indéfiniment. Dans l'exemple ci-dessus printf envoie EOFselect()
(oupoll()
ou etc) pour savoir si il y a des données à lire sur stdin. Vous pouvez le faire comme un instantané-sondage (en définissant le paramètre timeout à 0), ou vous pouvez avoirselect()
bloc jusqu'à ce que les données sont prêtes, et de revenir ensuite. Sur Unix, OS, STDIN_FILENO se comporte plus ou moins de la même façon que toute autre prise ou un descripteur de fichier (alors que sur Windows, vous êtes la plupart du temps hors de la chance: votre seule option est de contourner le problème en créant un thread séparé pour lire l'entrée standard stdin et transmettre les données vers le thread principal via un socket)