2012-12-24 3 views
6

Sto provando a scrivere una funzione che legge la variabile ogni 1 minuto e restituisce il valore di ogni volta. Il nome della variabile è proc:Come scrivere una funzione di polling in Python?

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

Il progresso è memorizzato nella variabile proc. Voglio che la funzione esegua il polling della variabile ogni 1 minuto e restituisca il valore. Questo è fatto fino a quando la variabile è al momento dell'esecuzione. Qual è il modo migliore per farlo?

provato ad utilizzare:

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) 

Nessuna fortuna però! Stampa l'intero progresso allo stesso tempo e loop over.

+0

È possibile controllare questo, http://stackoverflow.com/questions/1038907/run-a-task-at-specific- intervals-in-python –

risposta

4

Il codice seguente eseguirà rsync e leggerà qualsiasi output dal comando nel momento in cui è disponibile. Ho usato l'opzione --progress di rsync per far sì che stampi i suoi progressi. Gli aggiornamenti sullo stato di avanzamento a volte terminano con uno \n e talvolta su un \r. Quindi leggo i singoli personaggi e poi forma ogni riga di caratteri cercando uno di questi due personaggi. Ogni volta che incontro una nuova linea di progresso, la stampo sullo schermo. È possibile scegliere di fare qualsiasi cosa, ad esempio analizzando la percentuale di completamento e visualizzando una barra di avanzamento grafica. Se sei interessato a vedere come produrre una barra di avanzamento nel terminale check this answer out. Ho messo un esempio di chiamata della funzione di sincronizzazione e dell'output di esempio.

codice

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') 

uscita

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

Grazie mille per la risposta. Come faccio a mostrare la stessa cosa in Django (nel browser Web?) – user1881957

+0

@ user1881957 guardare http://stackoverflow.com/q/2922874/1699750. Controlla la mia risposta e anche le altre risposte. –

+0

Questo è stato molto utile ma non troppo specifico per la mia domanda. Puoi per favore modificare la tua risposta. – user1881957