如何在Python中编写一个轮询函数?

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)

但是没有运气!它一次性打印整个进度并循环。


你可以查看这个链接,https://dev59.com/jXNA5IYBdhLWcg3wPbSe - Qiang Jin
1个回答

4
下面的代码将运行rsync并读取命令输出的任何内容,一旦可用即时读取。我使用rsync的--progress选项以便打印出其进度。进度更新有时以\n结尾,有时以\r结尾。因此,我逐个字符地读取,然后通过查找这两个字符中的任意一个来形成每行字符。每当我遇到新的进度行时,就将其打印到屏幕上。您可以选择做任何事情,比如解析完成百分比并显示图形进度条。如果您有兴趣看如何在终端中生成进度条,请查看此答案。我放了一个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

非常感谢您的回答。我该如何在Django中展示同样的内容(在Web浏览器中)? - user1881957
@user1881957 请看 https://dev59.com/03A85IYBdhLWcg3wJf8a。请查看我的答案以及其他答案。 - Marwan Alsabbagh
那很有帮助,但并不是特别符合我的问题。您能否请编辑您的答案。 - user1881957
1
@user1881957 我建议您发布一个新问题,并详细说明您想要的内容。特别是对于Django,您想要进度条还是只需要文本输出?上面的答案解决了您提出的问题。同时,尝试自己编写代码,适应代码,向我们展示您遇到的困难。通常在Stack Overflow中,没有为您编写代码的文化,而是更多地帮助您解决面临的编码问题。 - Marwan Alsabbagh
我将发布一个新问题。是的,我想要进度条。 - user1881957
这里是新问题的链接: http://stackoverflow.com/questions/14027845/show-the-rsync-progress-using-the-following-code-in-django - user1881957

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接