2012-12-24 16 views
6

私は1分ごとに変数を読み取り、毎回の値を返す関数を記述しようとしています。変数名はproc:Pythonでポーリング関数を書くには?

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) 

運をしかし!同時に全体の進行状況を表示し、ループオーバーします。

+0

、http://stackoverflow.com/questions/1038907/run-a-task-at-specific-ピリオドインフィニオン –

答えて

4

以下のコードはrsyncを実行し、使用可能な時点でコマンドからの出力をすべて読み込みます。私はrsyncの--progressオプションを使って進捗状況を表示しました。進行状況の更新は、場合によっては\nで終了し、時には\rで終了します。だから私は個々の文字を読んでから、その2つの文字のいずれかを探して文字の各行を形成します。私が新しい進捗線に出くわすたびに、それを画面に印刷します。完全なパーセントを解析し、グラフィカルな進行状況バーを表示するなど、何かを行うことを選択できます。端末check this answer outに進捗バーを作成する方法を知りたい場合。私はsync関数とサンプル出力の例を挙げました。

コード

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 
+0

ありがとうございました。 Djangoで同じことを(ウェブブラウザで)どのように表示するのですか? – user1881957

+0

@ user1881957 http://stackoverflow.com/q/2922874/1699750を参照してください。私の答えと他の答えもチェックしてください。 –

+0

これはかなり役に立ちましたが、私の質問にはあまりにも具体的ではありませんでした。あなたはあなたの答えを編集してください。 – user1881957

関連する問題