动态不刷屏幕输出 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)

子线程完成自己的任务,主线程跟踪执行进度。

#! /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()
分类:脚本分享 时间:2012-11-14 人气:29
分享到:

相关文章

iOS 开发

Android 开发

Python 开发

JAVA 开发

开发语言

PHP 开发

Ruby 开发

搜索

前端开发

数据库

开发工具

开放平台

Javascript 开发

.NET 开发

云计算

服务器

Copyright (C) codeweblog.com, All Rights Reserved.

CodeWeblog.com 版权所有 闽ICP备15018612号

processed in 0.043 (s). 13 q(s)