6

1分ごとに変数を読み取り、毎回の値を返す関数を作成しようとしています。変数名はprocです:

proc = subprocess.Popen(['sshpass', '-p', password, 'rsync', '-avz', '--info=progress2', source12, destination], 
                                    stderr=subprocess.PIPE, stdout=subprocess.PIPE).communicate()[0]

進行状況はproc変数に保存されます。関数が1分ごとに変数をポーリングし、値を返すようにしたい。これは、変数が実行されるまで行われます。それを行うための最良の方法は何ですか?

使用してみました:

def doWork():
    while True:
        proc = subprocess.Popen(['sshpass', '-p', password, 'rsync', '-avz', '--info=progress2', source12, destination], 
                                    stderr=subprocess.PIPE, stdout=subprocess.PIPE).communicate()[0]stdout=subprocess.PIPE).communicate()[0]
        data = sort(proc)
        print data 
        time.sleep(10)

でも運がない!進行状況全体を同時に印刷し、ループします。

4

1 に答える 1

4

以下のコードはrsyncを実行し、コマンドが利用可能になった時点でコマンドからの出力を読み取ります。rsyncの--progressオプションを使用して、進行状況を出力しました。進行状況の更新は、で終わることもあれば\n、で終わることもあり\rます。そこで、私は個々の文字を読み、それらの2つの文字のいずれかを探して文字の各行を形成します。新しい進行状況ラインに遭遇するたびに、それを画面に印刷します。完了率を解析したり、グラフィカルなプログレスバーを表示したりするなど、何でも選択できます。ターミナルでプログレスバーを作成する方法を知りたい場合は、この回答を確認してください。同期関数の呼び出し例と出力例を入れました。

コード

from subprocess import Popen, PIPE

def sync(src, dest, passwd):
    cmd = ['sshpass', '-p', passwd, 'rsync', '-avz', '--progress', src, dest]
    p = Popen(cmd, stdout=PIPE)
    line = ''
    while True:
        c = p.stdout.read(1)
        if not c:
            break
        if c in ['\n', '\r']:
            print 'rsync progress: %s' % line
            line = ''
        else:
            line += c

sync('/path/big.txt', 'myserver:/path/', 'mypassword')

出力

rsync progress: sending incremental file list
rsync progress: big.txt
rsync progress: 
rsync progress:        32768   0%    0.00kB/s    0:00:00  
rsync progress:     65798144  31%   62.72MB/s    0:00:02  
rsync progress:    131596288  62%   62.77MB/s    0:00:01  
rsync progress:    197427200  94%   62.79MB/s    0:00:00  
rsync progress:    209715200 100%   62.80MB/s    0:00:03 (xfer#1, to-check=0/1)
rsync progress: 
rsync progress: sent 204032 bytes  received 31 bytes  45347.33 bytes/sec
rsync progress: total size is 209715200  speedup is 1027.70
于 2012-12-24T18:50:36.990 に答える