library - sys stdin read() python example
¿Cómo puedo determinar si sys.stdin se redirige desde un archivo frente a canalizado desde otro proceso? (1)
Estás buscando macros de stat
:
import os, stat
mode = os.fstat(0).st_mode
if stat.S_ISFIFO(mode):
print "stdin is piped"
elif stat.S_ISREG(mode):
print "stdin is redirected"
else:
print "stdin is terminal"
En un script de Python simple que se pretende ejecutar desde el shell, ¿puedo determinar de manera confiable si sys.stdin ha sido redirigido desde un archivo real en comparación con otro proceso?
Quiero cambiar el comportamiento del tiempo de ejecución en función de si la entrada estándar proviene de un archivo de datos en lugar de la transmisión de otro proceso a través de una canalización.
Como era de esperar, isatty()
devuelve False en ambos casos. Aquí hay una isatty()
rápida de isatty()
:
# test.py
import os
import sys
print sys.stdin.isatty()
print os.isatty(sys.stdin.fileno())
Pruebas:
python test.py < file.txt
produce:
False
False
y:
ls -al | python test.py
produce:
False
False
¿Hay un método pitónico para hacer esto?
Unix / Linux específico está bien, aunque sería bueno saber si es posible hacerlo de manera portátil.
Edición: Nota en respuesta a los comentaristas: ¿Por qué me importa? Bueno, en mi caso, quiero tratar con datos de marca de tiempo que vienen a intervalos irregulares cuando se canalizan desde otro proceso; cuando reproduzco datos pregrabados de un archivo, me gustaría volver a reproducirlos con un retraso fijo o variable.
Estoy de acuerdo en que probablemente sea ventajoso usar un método más limpio (y puedo pensar en varios, incluido un script intermedio para insertar retrasos en la secuencia de reproducción) pero al final tengo curiosidad .