Quando executo " python
" no terminal sem argumentos, ele abre o shell interativo do Python.
Quando executo " cat | python
" a partir do terminal, ele não inicia o modo interativo. De alguma forma, sem obter nenhuma entrada, ele detectou que está conectado a um tubo.
Como eu faria uma detecção semelhante em C ou C ++ ou Qt?
Respostas:
Use
isatty
:(No Windows eles são prefixados com sublinhados:
_isatty
,_fileno
)fonte
io.h
e paraisatty()
você precisa incluirunistd.h
.less
.Resumo
Para muitos casos de uso, a função POSIX
isatty()
é tudo o que é necessário para detectar se stdin está conectado a um terminal. Um exemplo mínimo:A seção a seguir compara diferentes métodos que podem ser usados se diferentes graus de interatividade tiverem que ser testados.
Métodos em Detalhe
Existem vários métodos para detectar se um programa está sendo executado interativamente. A tabela a seguir mostra uma visão geral:
Os resultados são de um sistema Ubuntu Linux 11.04 usando o seguinte programa:
Dispositivo Termimal
Se a sessão interativa precisa de certos recursos, você pode abrir o dispositivo de terminal e (temporariamente) definir os atributos de terminal que você precisa via
tcsetattr()
.Exemplo Python
O código Python que decide se o interpretador é executado interativamente usa
isatty()
. A funçãoPyRun_AnyFileExFlags()
chamadas
Py_FdIsInteractive()
que chama
isatty()
.Conclusão
Existem diferentes graus de interatividade. Para verificar se
stdin
está conectado a um pipe / arquivo ou um terminal realisatty()
é um método natural para fazer isso.fonte
Provavelmente, eles estão verificando o tipo de arquivo que "stdin" está com fstat, algo assim:
É claro que o Python é de código aberto, então você pode apenas ver o que eles fazem e saber com certeza:
http://www.python.org/ftp/python/2.6.2/Python-2.6.2.tar.bz2
fonte
No Windows, você pode usar GetFileType.
fonte
Chame stat () ou fstat () e veja se S_IFIFO está definido em st_mode.
fonte
Você pode ligar
stat(0, &result)
e verificar!S_ISREG( result.st_mode )
. Isso é Posix, não C / C ++, no entanto.fonte