Python 如何获取大文件的实时复制进度?
How can you get real time copy progress of a large file with Python?
我到处搜索,每次我发现看起来很有希望的东西都没有被淘汰。
最终我想从 python 内部获取 linux 机器上文件复制的实时进度。我将取得进展并将其发送到带有 Flask-SocketIO 的客户端网页,可能是线程化的以避免阻塞。
我不介意是 rsync、复制还是任何其他方式...(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
但是,这会通过标准输出报告输出。我想在变量中捕获此输出并发出它。
标准输出进度如下所示,其中一行不断更新:
large_file.tar
323,780,608 19% 102.99MB/秒 0:00:12
当我打印名为 'out' 的变量时,我得到一个字符打印到屏幕上,一遍又一遍地循环换行。
如何以可用于传输到客户端的方式捕获此信息?
有没有办法在每次刷新状态时抓取整行?
我过去所做的是分块复制数据并使用回调函数来监控进度。类似于:
# Python_2
def copy_with_callback(sourceFile, destinationFile, callbackFunction):
chunk = 4*1024
sourceSize = os.path.getsize(sourceFile)
destSize = 0
with open(sourceFile, 'rb') as fSrc:
with open(destinationFile, 'wb') as fDest:
data = fSrc.read(chunk)
if len(data) == 0:
break
fDest.write(data)
destSize += len(data)
callbackFunction(sourceSize, destSize)
def example_callback_function(srcSize, dstSize):
''' Just an example with print. Your viewer code will vary '''
print 'Do something with these values:', srcSize, dstSize
print 'Percent?', 100.0 * dstSize / srcSize
def main():
src = '/tmp/A/path/to/a/file.txt'
dest = '/tmp/Another/path/to/a/file.txt'
copy_with_callback(src, dest, example_callback_function)
优点是此 python 代码不依赖于 OS 特定功能。
我到处搜索,每次我发现看起来很有希望的东西都没有被淘汰。
最终我想从 python 内部获取 linux 机器上文件复制的实时进度。我将取得进展并将其发送到带有 Flask-SocketIO 的客户端网页,可能是线程化的以避免阻塞。
我不介意是 rsync、复制还是任何其他方式...(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
但是,这会通过标准输出报告输出。我想在变量中捕获此输出并发出它。
标准输出进度如下所示,其中一行不断更新: large_file.tar 323,780,608 19% 102.99MB/秒 0:00:12 当我打印名为 'out' 的变量时,我得到一个字符打印到屏幕上,一遍又一遍地循环换行。
如何以可用于传输到客户端的方式捕获此信息?
有没有办法在每次刷新状态时抓取整行?
我过去所做的是分块复制数据并使用回调函数来监控进度。类似于:
# Python_2
def copy_with_callback(sourceFile, destinationFile, callbackFunction):
chunk = 4*1024
sourceSize = os.path.getsize(sourceFile)
destSize = 0
with open(sourceFile, 'rb') as fSrc:
with open(destinationFile, 'wb') as fDest:
data = fSrc.read(chunk)
if len(data) == 0:
break
fDest.write(data)
destSize += len(data)
callbackFunction(sourceSize, destSize)
def example_callback_function(srcSize, dstSize):
''' Just an example with print. Your viewer code will vary '''
print 'Do something with these values:', srcSize, dstSize
print 'Percent?', 100.0 * dstSize / srcSize
def main():
src = '/tmp/A/path/to/a/file.txt'
dest = '/tmp/Another/path/to/a/file.txt'
copy_with_callback(src, dest, example_callback_function)
优点是此 python 代码不依赖于 OS 特定功能。