【发布时间】:2016-09-20 23:07:23
【问题描述】:
我从高处和低处搜索过,每次我发现一些看起来很有希望的东西都没有被淘汰。
最终,我想从 python 内部获取 linux 机器上文件副本的实时进度。我将利用该进度并将其发送到带有 Flask-SocketIO 的客户端网页,可能是线程化以避免阻塞。
我不介意它是 rsync、copy 还是任何其他方式......(shutil 等)来处理实际的副本。我只想要一个钩子来通过套接字推送更新。
到目前为止,我发现这是最有前途的。但是,我不太了解它的控制台打印机制,因为当我尝试将输出打印到文件或只是常规 Python 打印时,它一次只输出一个字符。
import subprocess
import sys
def copy_with_progress(src, dst):
cmd = 'rsync --progress --no-inc-recursive %s %s'%(src, dst)
sub_process = subprocess.Popen(cmd, close_fds=True, shell=True, stdout=subproces.PIPE, stderr=subprocess.PIPE)
while sub_process.poll() is None:
out = sub_process.stdout.read(1)
sys.stdout.write(out)
sys.stdout.flush()
src = '/home/user/Downloads/large_file.tar'
dst = '/media/usbdrive/large_file.tar'
copy_with_progress(src, dst)
来自这个 SO 问题:Getting realtime output using subprocess
但是,这会通过标准输出报告输出。我想在一个变量中捕获这个输出并发出它。
stdout 进度是这样的,其中一行不断更新: 大文件.tar 323,780,608 19% 102.99MB/s 0:00:12 当我打印名为“out”的变量时,我会得到一个字符,该字符会打印到屏幕上,一遍又一遍地循环换行。
如何以可用于传输到客户端的方式捕获此信息?
有没有办法在每次刷新状态时抓取整行?
【问题讨论】:
-
您可以只
stat源文件获取总大小,然后定期stat目标文件获取当前大小,只要子进程正在运行。您可以查看用户界面的tqdm包(手动模式)。 -
您一次读取一个字节,这就是您希望看到的内容
-
您将如何读取循环的每次迭代的所有可用字节?
-
使用
sub_process.stdout.readline()比sub_process.stdout.read(1)快一点
标签: python linux rsync flask-socketio