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
).