Wenn ich " python
" vom Terminal ohne Argumente ausführe , wird die interaktive Python-Shell aufgerufen.
Wenn ich " cat | python
" vom Terminal aus ausführe , wird der interaktive Modus nicht gestartet. Irgendwie hat es ohne Eingabe festgestellt, dass es mit einer Pipe verbunden ist.
Wie würde ich eine ähnliche Erkennung in C oder C ++ oder Qt durchführen?
Antworten:
Verwendung
isatty
:(Unter Windows werden ihnen Unterstriche vorangestellt :
_isatty
,_fileno
)quelle
io.h
und fürisatty()
Sie müssen enthaltenunistd.h
.less
.Zusammenfassung
Für viele Anwendungsfälle ist die POSIX- Funktion
isatty()
alles, was benötigt wird, um festzustellen, ob stdin an ein Terminal angeschlossen ist. Ein minimales Beispiel:Im folgenden Abschnitt werden verschiedene Methoden verglichen, die verwendet werden können, wenn unterschiedliche Interaktivitätsgrade getestet werden müssen.
Methoden im Detail
Es gibt verschiedene Methoden, um festzustellen, ob ein Programm interaktiv ausgeführt wird. Die folgende Tabelle zeigt eine Übersicht:
Die Ergebnisse stammen von einem Ubuntu Linux 11.04-System mit folgendem Programm:
Endgerät
Wenn für die interaktive Sitzung bestimmte Funktionen erforderlich sind, können Sie das Endgerät öffnen und (vorübergehend) die erforderlichen Terminalattribute festlegen
tcsetattr()
.Python-Beispiel
Der Python-Code, der entscheidet, ob der Interpreter interaktiv ausgeführt wird, wird verwendet
isatty()
. Die FunktionPyRun_AnyFileExFlags()
Anrufe
Py_FdIsInteractive()
was anruft
isatty()
.Fazit
Es gibt verschiedene Grade an Interaktivität. Die Überprüfung, ob
stdin
eine Verbindung zu einer Pipe / Datei oder einem realen Terminal besteht,isatty()
ist eine natürliche Methode, um dies zu tun.quelle
Wahrscheinlich überprüfen sie den Dateityp, den "stdin" mit fstat hat, ungefähr so:
Natürlich ist Python Open Source, also können Sie sich einfach ansehen, was sie tun und sicher wissen:
http://www.python.org/ftp/python/2.6.2/Python-2.6.2.tar.bz2
quelle
Unter Windows können Sie GetFileType verwenden.
quelle
Rufen Sie stat () oder fstat () auf und prüfen Sie, ob S_IFIFO im st_mode eingestellt ist.
quelle
Sie können anrufen
stat(0, &result)
und suchen nach!S_ISREG( result.st_mode )
. Das ist Posix, nicht C / C ++.quelle