2014-12-17 29 views
12

Bazı ağ kaynaklarının durumlarını izlemek için bir python betiği yazdım, eğer sonsuz bir pinge yapacaksınız. Bir klavye kesmesi alana kadar aynı 3 düğüme ping verir. Ben bir dosyaya programın çıktısını yönlendirmek için tee kullanarak denedim ama çalışmıyor: benim çıkış için colorama kullanıyorumTee çıktı göstermiyor ya da dosyaya yazmıyor

λ 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 

, belki soruna neden olabileceğini düşündüm, ama baskı çalıştı colorama bile ithal etmeden önce dosya hala boş. Burada neyi yanlış yapıyorum?

Düzenleme: İşte

#!/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() 
+0

Pingter yazımı nasıl çıktı? –

+0

Sadece python vanilla yazdırma işlevini kullanarak –

+0

Does 'sudo ./pingster.py | kedi gösterisi çıktı? –

cevap

20

kullanıyorum piton dosya İşte sorununuzu yeniden daha basit bir yolu olduğunu:

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

bu olur çünkü bir terminal değil stdout'u python tamponlar. Bunu unbuffer en kolay yolu python -u kullanmaktır:

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

Ayrıca #!/usr/bin/python -u için shebang (bu env ile çalışmaz) ayarlayabilirsiniz.

+0

Bu mükemmel çalıştı, teşekkürler! –

+2

Eğer "python" çağrısını değiştiremezseniz, "PYTHONUNBUFFERED" ortam değişkenini boş olmayan bir dizeye ayarlayabilir ve bu aynı etkiye sahip olacaktır. 'adam python' davranışı daha ayrıntılı olarak anlatıyor – dimo414

İlgili konular