如何用Python编写轮询函数?

2024-04-25 07:41:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试编写一个函数,它每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)

不过运气不好!它同时打印整个进程并循环。


Tags: 函数infostdoutpasswordprocdestinationrsyncsubprocess
1条回答
网友
1楼 · 发布于 2024-04-25 07:41:45

下面的代码将运行rsync,并在命令可用时读取命令的任何输出。我使用rsync的--progress选项打印出它的进度。进度更新有时以\n结尾,有时以\r结尾。所以我阅读单个字符,然后通过查找这两个字符中的任何一个来形成每行字符。每当我遇到一个新的进度线,我就把它打印到屏幕上。您可以选择执行任何操作,例如分析完成百分比并显示图形进度条。如果您有兴趣了解如何在终端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

相关问题 更多 >