Cuando ejecuto " python
" desde la terminal sin argumentos, aparece el shell interactivo de Python.
Cuando ejecuto " cat | python
" desde la terminal, no inicia el modo interactivo. De alguna manera, sin recibir ninguna entrada, ha detectado que está conectado a una tubería.
¿Cómo haría una detección similar en C o C ++ o Qt?
Respuestas:
Utilizar
isatty
:(En las ventanas que están precedidos por guiones:
_isatty
,_fileno
)fuente
io.h
yisatty()
debe incluirlounistd.h
.less
.Resumen
Para muchos casos de uso, la función POSIX
isatty()
es todo lo que se necesita para detectar si stdin está conectado a un terminal. Un ejemplo mínimo:La siguiente sección compara diferentes métodos que se pueden utilizar si se tienen que probar diferentes grados de interactividad.
Métodos en detalle
Existen varios métodos para detectar si un programa se está ejecutando de forma interactiva. La siguiente tabla muestra una descripción general:
Los resultados son de un sistema Ubuntu Linux 11.04 usando el siguiente programa:
Dispositivo termimal
Si la sesión interactiva necesita ciertas capacidades, puede abrir el dispositivo terminal y (temporalmente) establecer los atributos del terminal que necesita a través de
tcsetattr()
.Ejemplo de Python
El código Python que decide si el intérprete se ejecuta de forma interactiva usa
isatty()
. La funciónPyRun_AnyFileExFlags()
llamadas
Py_FdIsInteractive()
que llama
isatty()
.Conclusión
Hay diferentes grados de interactividad. Para comprobar si
stdin
está conectado a una tubería / archivo o una terminal realisatty()
es un método natural para hacerlo.fuente
Probablemente estén comprobando el tipo de archivo que "stdin" es con fstat, algo como esto:
Por supuesto, Python es de código abierto, por lo que puede ver lo que hacen y estar seguro:
http://www.python.org/ftp/python/2.6.2/Python-2.6.2.tar.bz2
fuente
En Windows puede usar GetFileType.
fuente
Llame a stat () o fstat () y vea si S_IFIFO está configurado en st_mode.
fuente
Puede llamar
stat(0, &result)
y verificar!S_ISREG( result.st_mode )
. Sin embargo, eso es Posix, no C / C ++.fuente