2016-08-09 139 views
2

Ich verwende Paramiko, um rsync auf einem Remote-Computer auszuführen. Wenn ich stdout.readlines() verwende, blockiert es mein Programm und gibt eine Menge Zeilen aus, nachdem der Befehl beendet ist. Ich weiß rsync Fortschritt aktualisiert immer seine Ausgabe. Wie lese ich die Ausgabe jedes Intervall, ohne auf den Abschluss des Befehls zu warten (ich übertrage eine sehr große Datei).Paramiko & rsync - Get Progress asynchron während Befehl ausgeführt wird

import paramiko 
import time 
ssh = paramiko.SSHClient() 
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
ssh.connect(...) 

stdin, stdout, stderr = ssh.exec_command("rsync...") 
counter = 0 
while True: 
    counter += 1 
    print stdout.readlines(), stderr.readlines(), counter 
    time.sleep(3) 

Antwort

0

Statt readlines() der Verwendung sollten Sie read([bytes]) verwenden schrittweise Ausgabe zu lesen. readlines() liest alle Zeilen bis EOF (deshalb sehen Sie die Blockierung) und teilt sich dann in Zeilen auf dem \n Zeichen.

Stattdessen etwas tun, wie folgt aus:

while True: 
    counter += 1 
    print(stdout.read(2048), stderr.read(2048), counter) 
    time.sleep(3) 

Hinweis: Dies ist nicht immer die Schleife beenden, könnten Sie beendet die Schleife zu prüfen, ob die Ausgabe sowohl von stdout und stderr Länge Null haben.