我正在编写一个Python/Django应用程序,该应用程序使用rsync协议(protocol)将文件从服务器传输到本地计算机。我们将处理大文件,因此进度条是必填项。 --progress
命令中的rsync
参数可以很好地做到这一点。所有详细进度都显示在终端中。如何在Web浏览器中显示进度?是否有任何钩子(Hook)函数或类似的东西?还是可以将进度存储在日志文件中,每隔一分钟左右对其进行调用和更新?
最佳答案
基本原则是在子进程中运行rsync,公开Web API并通过javascript 获取更新
这是一个例子。
import subprocess
import re
import sys
print('Dry run:')
cmd = 'rsync -az --stats --dry-run ' + sys.argv[1] + ' ' + sys.argv[2]
proc = subprocess.Popen(cmd,
shell=True,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,)
remainder = proc.communicate()[0]
mn = re.findall(r'Number of files: (\d+)', remainder)
total_files = int(mn[0])
print('Number of files: ' + str(total_files))
print('Real rsync:')
cmd = 'rsync -avz --progress ' + sys.argv[1] + ' ' + sys.argv[2]
proc = subprocess.Popen(cmd,
shell=True,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,)
while True:
output = proc.stdout.readline()
if 'to-check' in output:
m = re.findall(r'to-check=(\d+)/(\d+)', output)
progress = (100 * (int(m[0][1]) - int(m[0][0]))) / total_files
sys.stdout.write('\rDone: ' + str(progress) + '%')
sys.stdout.flush()
if int(m[0][0]) == 0:
break
print('\rFinished')
但这仅向我们显示了标准输出(
stdout
)中的进度。但是,我们可以修改此代码以将进度作为JSON输出返回,并且可以通过创建的
progress webservice/API
使此输出可用。在客户端使用时,我们将随后编写JavaScript(ajax)与
progress webservice/API
联系,并使用该信息更新客户端等内容。文字消息,图片宽度,某些div的颜色等关于python - 如何使用DJango在Web浏览器中显示rsync --progress?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13523931/