2016-08-09 53 views
2

私はリモートマシン上でrsyncを実行するためにparamikoを使用しています。 stdout.readlines()を使用すると、プログラムがブロックされ、コマンドが終了した後に大量の行が出力されます。私はrsyncの進捗状況が常にその出力を更新することを知っている。コマンドを完了するのを待つことなく、間隔ごとに出力を読み取るにはどうすればよいですか(非常に大きなファイルを転送しています)。Paramiko&rsync - コマンド実行中に進行を非同期で取得する

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) 

答えて

0

代わりreadlines()を使用してのあなたは、徐々に出力を読み取るためにread([bytes])を使用する必要があります。 readlines()はEOFまですべての行を読み込みます(そのため、ブロックされていることがわかります)。その後、\n文字の行に分割されます。

代わりに、このような何かを:

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

注:これは、これまでのループを終了していない、あなたがstdoutとstderrの両方からの出力は、長さがゼロを持っている場合、ループを終了を検討することをお勧めします。

関連する問題