python : 动态不刷屏幕输出 python/shell 实现
前言后台运行程序有一种需求,比如查看当前进度,想在终端看到某个值的变化情况: 先提供一种很土的办法,把进度落地文件为 例如 process,采用创建写的方式。然后可以使用watch -n 1 cat process来查看进度。 这里提供两种方式,python和shell shell版本,如下(附带一个进度条的例子) #! /bin/bash for ((i=0; $i<=100; i+=1)) do printf "progress: [%-100s] %d%%\r" "xxxxxxxxxx xxx xxx" $i sleep 1 done function sleepPrograss(){ [ $# -eq 0 ] && echo "sleepPrograss Usage: sleepPrograss 10 " [ $# -eq 0 ] && return 1 allTime=$1 strDone='' stepTime=$(echo "scale=1; $allTime/100" | bc) for ((i=0; $i<=100; i+=1)) do printf "progress: [%-100s] %d%%\r" $strDone $i sleep $stepTime strDone+='#' done echo } python版本,如下(附一个多线程输出进度的例子) 基础用法示例 #! /usr/bin/env python import os import sys import time while 1: os.write(1, "\r[%.3f]" % time.time()) sys.stdout.flush() time.sleep(1) 子线程完成自己的任务,主线程跟踪执行进度。 ** 小编推荐一个学python的学习qun 740322234无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享! ** #! /usr/bin/env python # -*- coding: utf-8 -*- ''' @filename : demo.py @authors : U{peterguo<mailto: peterguo@tencent.com>} @copyright: tencent @date : 2012-11-15 @version : 1.0.0.1 ''' import os import sys import time import thread g_nTotal = 100 g_nProcessed = 0 g_fStartTime = time.time() def simpleThdreadFun(interval): global g_nProcessed global g_nTotal while g_nTotal > g_nProcessed: time.sleep(interval) g_nProcessed += 1 thread.exit_thread() def test(): global g_nTotal global g_nProcessed global g_fStartTime g_fStartTime = time.time() thread.start_new_thread(simpleThdreadFun, (1,)) thread.start_new_thread(simpleThdreadFun, (2,)) thread.start_new_thread(simpleThdreadFun, (3,)) thread.start_new_thread(simpleThdreadFun, (4,)) while True: time.sleep(0.5) fRunTime = time.time() - g_fStartTime nLeftNum = g_nTotal - g_nProcessed fLeftTime = fRunTime * nLeftNum / (g_nProcessed + 0.1) fPrograss = 100.0 * g_nProcessed / g_nTotal os.write(1, "\rLeftTime[%.3f]\tLeftNum[%d]\tProgress[%.3f %% (%d/%d) ]" % (fLeftTime, nLeftNum, fPrograss, g_nProcessed, g_nTotal)) sys.stdout.flush() if g_nTotal <= g_nProcessed: break print "\nTest Done, use %.3f seconds" % (time.time() - g_fStartTime) if __name__=='__main__': test()