python bash tee colorama

python - Tee no muestra salida o escritura a archivo



bash colorama (1)

Escribí una secuencia de comandos de Python para monitorear los estados de algunos recursos de red, un tono infinito, por así decirlo. Hace ping a los mismos 3 nodos para siempre hasta que recibe una interrupción del teclado. Intenté usar tee para redirigir la salida del programa a un archivo, pero no funciona:

λ sudo ./pingster.py 15:43:33 node1 SUCESS | node2 SUCESS | node3 SUCESS 15:43:35 node1 SUCESS | node2 SUCESS | node3 SUCESS 15:43:36 node1 SUCESS | node2 SUCESS | node3 SUCESS 15:43:37 node1 SUCESS | node2 SUCESS | node3 SUCESS 15:43:38 node1 SUCESS | node2 SUCESS | node3 SUCESS ^CTraceback (most recent call last): File "./pingster.py", line 42, in <module> main() File "./pingster.py", line 39, in main sleep(1) KeyboardInterrupt λ sudo ./pingster.py | tee ping.log # wait a few seconds ^CTraceback (most recent call last): File "./pingster.py", line 42, in <module> main() File "./pingster.py", line 39, in main sleep(1) KeyboardInterrupt λ file ping.log ping.log: empty

Estoy usando colorama para mi salida, pensé que quizás podría estar causando el problema, pero intenté imprimir algo antes de importar colorama, y ​​el archivo todavía está vacío. ¿Qué estoy haciendo mal aquí?

Editar: Aquí está el archivo de python que estoy usando

#!/home/nate/py-env/ping/bin/python from __future__ import print_function from datetime import datetime from collections import OrderedDict from time import sleep import ping import colorama def main(): d = { ''node1'': ''10.0.0.51'', ''node2'': ''10.0.0.50'', ''node3'': ''10.0.0.52'', } addresses = OrderedDict(sorted(d.items(), key=lambda t: t[0])) colorama.init() while True: status = [] time = datetime.now().time().strftime(''%H:%M:%S'') print(time, end=''/t'') for location, ip_address in addresses.items(): loss, max_time, avg_time = ping.quiet_ping(ip_address, timeout=0.5) if loss < 50: status.append(''{0} SUCESS''.format(location)) else: status.append( ''{}{} FAIL{}''.format( colorama.Fore.RED, location, colorama.Fore.RESET, ) ) print('' | ''.join(status)) sleep(1) if __name__ == ''__main__'': main()


Aquí hay una forma más sencilla de reproducir su problema:

$ cat foo.py from time import sleep while True: sleep(2) print "hello" $ python foo.py hello hello (...) $ python foo.py | tee log (no output)

Esto sucede porque python almacena stdout cuando no es un terminal. La forma más fácil de desempañar es usar python -u :

$ python -u foo.py | tee log hello hello (...)

También puede configurar shebang en #!/usr/bin/python -u (esto no funciona con env ).