Quand j'exécute " python
" depuis le terminal sans argument, cela fait apparaître le shell interactif Python.
Lorsque j'exécute " cat | python
" depuis le terminal, il ne lance pas le mode interactif. D'une manière ou d'une autre, sans obtenir aucune entrée, il a détecté qu'il est connecté à un tuyau.
Comment faire une détection similaire en C ou C ++ ou Qt?
Réponses:
Utilisez
isatty
:(Sur les fenêtres , ils sont préfixées avec underscores:
_isatty
,_fileno
)la source
io.h
etisatty()
vous devez inclureunistd.h
.less
.Résumé
Dans de nombreux cas d'utilisation, la fonction POSIX
isatty()
est tout ce dont il a besoin pour détecter si stdin est connecté à un terminal. Un exemple minimal:La section suivante compare différentes méthodes qui peuvent être utilisées si différents degrés d'interactivité doivent être testés.
Méthodes en détail
Il existe plusieurs méthodes pour détecter si un programme s'exécute de manière interactive. Le tableau suivant montre un aperçu:
Les résultats proviennent d'un système Ubuntu Linux 11.04 utilisant le programme suivant:
Appareil Termimal
Si la session interactive nécessite certaines fonctionnalités, vous pouvez ouvrir le terminal et définir (temporairement) les attributs de terminal dont vous avez besoin via
tcsetattr()
.Exemple Python
Le code Python qui décide si l'interpréteur s'exécute de manière interactive utilise
isatty()
. La fonctionPyRun_AnyFileExFlags()
appels
Py_FdIsInteractive()
qui appelle
isatty()
.Conclusion
Il existe différents degrés d'interactivité. Vérifier si
stdin
est connecté à un tube / fichier ou à un terminal réelisatty()
est une méthode naturelle pour le faire.la source
Ils vérifient probablement le type de fichier que "stdin" est avec fstat, quelque chose comme ceci:
Bien sûr, Python est open source, vous pouvez donc simplement regarder ce qu'ils font et en être sûr:
http://www.python.org/ftp/python/2.6.2/Python-2.6.2.tar.bz2
la source
Sous Windows, vous pouvez utiliser GetFileType.
la source
Appelez stat () ou fstat () et voyez si S_IFIFO est défini dans st_mode.
la source
Vous pouvez appeler
stat(0, &result)
et vérifier!S_ISREG( result.st_mode )
. C'est Posix, pas C / C ++, cependant.la source