2012-12-24 51 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- python間隔 –

回答

4

下面的代碼將運行rsync並在命令可用時讀取該命令的任何輸出。我使用rsync的--progress選項來讓它打印出進度。進度更新有時以\n結尾,有時以\r結尾。所以我閱讀單個字符,然後通過查找這兩個字符中的任何一個來形成每行字符。每當我遇到新的進度線時,我都會將它打印到屏幕上。您可以選擇做任何事情,例如解析完成百分比並顯示圖形化進度條。如果您有興趣瞭解如何在終端check this answer out中製作進度條。我舉了一個同步函數和示例輸出的示例調用。

代碼

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中顯示相同的內容(在Web瀏覽器中?) – user1881957

+0

@ user1881957請參閱http://stackoverflow.com/q/2922874/1699750。看看我的答案和其他答案。 –

+0

這是相當有用的,但不是特定於我的問題。你可以請編輯你的答案。 – user1881957