En algunas situaciones excepcionales, es posible que le importe a qué stdin esté conectado. En general, no te importa, acabas de leer stdin.
En someprocess | python myprogram.py
, stdin está conectado a una tubería; en este caso, el stdout del proceso anterior. Simplemente lea desde sys.stdin
y está leyendo desde el otro proceso. [Tenga en cuenta que en Windows, sin embargo, todavía hay (potencialmente) un dispositivo "CON" con un teclado. Simplemente no será sys.stdin
.]
En python myprogram.py <someFile
, stdin está conectado a un archivo. Simplemente lea desde sys.stdin
y está leyendo desde el archivo.
En python myprogram.py
, stdin queda conectado a la consola (/dev/ttyxx
en * nix). Usted simple lectura de sys.stdin
y está leyendo desde el teclado.
Tenga en cuenta el tema común en los tres casos anteriores. Simplemente lea desde sys.stdin
y el entorno de su programa lo define todo por usted. No verifica "para ver si los datos están disponibles en stdin para leer". Ya está disponible.
A veces, desea una interrupción del teclado (u otras travesuras). Python, BTW, tiene una interrupción de teclado como característica de primera clase de los elementos de E/S. Control-C genera una interrupción durante la E/S (no se romperá en un circuito cerrado, pero indicará un programa que imprime periódicamente.)
A veces necesita averiguar a qué tipo de archivo está conectado el archivo stdin
.
Algo así como os.isatty(sys.stdin.fileno())
Si sys.stdin
es un TTY, su programa fue dejado conectado a la ventana "CON" (el teclado). Si sys.stdin
no es un TTY, está conectado a un archivo o una tubería.
Ejemplo
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.
C:\Documents and Settings\slott>python
Python 2.5.2 (r252:60911, Feb 21 2008, 13:11:45) [MSC v.1310 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> import sys
>>> os.isatty(sys.stdin.fileno())
True
>>>
El valor de True
me dice Python se está ejecutando sin un archivo o una tubería conectada. sys.stdin
es el teclado. Usar Windows kbhit
es innecesario.
Un valor de False
me dice que Python se está ejecutando con un archivo o un conducto adjunto. sys.stdin
NO es el teclado. Verificar kbhit
puede ser significativo.Además, podría abrir el dispositivo CON:
y leer el teclado directamente, separado de sys.stdin
.
no estoy seguro de por qué es necesario "para ver si hay datos disponibles sobre la entrada estándar para la lectura". Puede ser útil actualizar tu pregunta con detalles adicionales de lo que intentas lograr.
os.isatty (sys.stdin.fileno()) devuelve Falso – awatts