python程序运行进程、使用时间、剩余时间显示功能的实现代码

实现Python程序的运行进程、使用时间和剩余时间的显示功能需要使用Python标准库中的time模块和os模块。下面是一个完整的实现代码和详细的攻略说明:

import time
import os

def get_terminal_size():
    """
    获取终端窗口大小
    """
    env = os.environ
    def ioctl_GWINSZ(fd):
        try:
            import fcntl, termios, struct
            cr = struct.unpack('hh', fcntl.ioctl(fd, termios.TIOCGWINSZ, '1234'))
        except:
            return None
        return cr
    cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2)
    if not cr:
        try:
            fd = os.open(os.ctermid(), os.O_RDONLY)
            cr = ioctl_GWINSZ(fd)
            os.close(fd)
        except:
            pass
    if not cr:
        cr = (env.get('LINES', 25), env.get('COLUMNS', 80))

    return int(cr[1]), int(cr[0])

def format_time(seconds):
    """
    格式化时间,将秒数转换为 HH:MM:SS 格式
    """
    m, s = divmod(int(seconds), 60)
    h, m = divmod(m, 60)
    return f"{h:02d}:{m:02d}:{s:02d}"

def progress_bar(current, total, start_time, bar_width=None):
    """
    显示进度条,并计算出剩余时间和预计完成时间
    """
    if bar_width is None:
        bar_width, _ = get_terminal_size()
        bar_width -= 30

    percent = current / total
    elapsed_time = time.time() - start_time
    eta = elapsed_time * (total - current) / current
    prefix = f"{current}/{total} "
    suffix = f" [{percent*100:.1f}%] | Time: {format_time(elapsed_time)} / ETA: {format_time(eta)}"
    suffix_length = len(suffix)

    bar_length = bar_width - len(prefix) - suffix_length
    filled_length = int(bar_length * percent)
    bar = "#" * filled_length + "-" * (bar_length - filled_length)

    print(f"\r{prefix}{bar}{suffix}", end="", flush=True)

def main():
    total = 100
    start_time = time.time()
    for i in range(total):
        progress_bar(i+1, total, start_time)
        time.sleep(0.1)
    print()

if __name__ == "__main__":
    main()

解释如下:

  1. 首先,使用get_terminal_size()函数获取终端窗口大小,以便决定进度条的宽度(默认为窗口宽度减去固定前缀和后缀的总长度)。该函数的实现参考了 stackoverflow 上的一篇问题的回答。
  2. format_time()函数用于将用秒数表示的时间格式化为HH:MM:SS的字符串形式。
  3. progress_bar()函数用于显示进度条。它需要传入进度条的当前进度、总进度、开始时间,以及可选的进度条宽度(如果没有传入宽度,则根据终端窗口大小自动计算)。该函数首先计算出进度条长度,然后将已完成部分和未完成部分用#和-表示,拼接起来。剩余时间和预计完成时间由总共已花费时间和已完成进度计算得出,并根据format_time函数格式化为字符串。prefix和suffix分别表示进度条前缀和后缀的内容。
  4. 主程序main()函数用于演示进度条的使用。它首先设定总共需要完成的进度总数,然后在一个循环中依次更新进度条的进度,以及计算剩余时间和预计完成时间。
  5. 最后,如果程序是直接运行的,则调用main()函数。

下面是两个使用进度条显示功能的示例:

import time

def expensive_operation():
    """
    一些耗时较长的操作
    """
    time.sleep(2)

def main1():
    total = 10
    start_time = time.time()
    for i in range(total):
        expensive_operation()
        progress_bar(i+1, total, start_time)
    print()

def main2():
    total = 100
    start_time = time.time()
    for i in range(total):
        progress_bar(i+1, total, start_time, bar_width=60)
        time.sleep(0.1)
    print()

if __name__ == "__main__":
    main1()
    main2()

在main1中,进度条的宽度是根据终端窗口大小动态计算的。在main2中,通过传入bar_width参数,手动指定宽度为60。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python程序运行进程、使用时间、剩余时间显示功能的实现代码 - Python技术站

(0)
上一篇 2023年6月2日
下一篇 2023年6月2日

相关文章

  • Python冲顶大会 快来答题!

    Python冲顶大会 快来答题! 攻略 游戏介绍 Python冲顶大会是一款基于Python编程语言的知识竞赛游戏,具有以下特点: 题目覆盖Python编程的各个方面,包括基础语法、常用函数、标准库、第三方库等; 通过答题竞赛的形式,增强了学习Python的趣味性和互动性; 通过比拼答题正确率和速度,可以提升自己的Python编程技能和应试能力。 策略分享 …

    python 2023年6月5日
    00
  • python抓取网页时字符集转换问题处理方案分享

    关于“python抓取网页时字符集转换问题处理方案分享”的攻略,可以包含以下几个方面的内容: 1. 理解字符编码 在处理字符集转换问题时,需要首先理解字符编码的概念。常见的字符编码包括ASCII、GB2312、GBK、UTF-8等等,不同的编码方式对应着不同的字符集,因此在处理字符集转换问题时,要先确定所处理的网页使用哪种编码方式。 2. 确认网页编码方式 …

    python 2023年5月20日
    00
  • Python I/O与进程的详细讲解

    Python I/O 与进程的详细讲解 在Python中,I/O和进程是非常重要的概念。本篇攻略将对Python中的I/O和进程进行详细讲解,帮助你加深对这些概念的理解。 I/O 在Python中,I/O操作是一种与输入和输出设备之间进行数据交互的操作。常见的I/O操作包括读取文件、网络通信等。Python提供了一些内置函数来进行I/O操作。 打开文件 在P…

    python 2023年6月2日
    00
  • 一篇文章告诉你如何用python进行自动化测试,调用c程序

    一篇文章告诉你如何用Python进行自动化测试,调用C程序 简介 本文将介绍如何使用Python进行自动化测试并调用C程序。自动化测试是指使用脚本程序或自动化软件来自动执行测试,以便更有效地发现和修复错误。而调用C程序可以实现更复杂的操作,比如与底层硬件交互,进行更高效的计算等。本文将介绍如何使用Python测试C代码,自动执行C程序并生成测试报告。 准备工…

    python 2023年5月19日
    00
  • 浅谈Python2.6和Python3.0中八进制数字表示的区别

    浅谈Python2.6和Python3.0中八进制数字表示的区别 在Python中,数字可以用十进制、八进制和十六进制来表示,本文主要讨论Python2.6和Python3.0中八进制数字表示的区别。 Python2.6中的八进制数字表示 在Python2.6及之前的版本中,八进制数字可以用0开头表示,如下所示: >>> octal_num…

    python 2023年6月3日
    00
  • 解决pycharm安装第三方库失败的问题

    以下是关于“解决 PyCharm 安装第三方库失败的问题”的完整攻略: 问题描述 在使用 PyCharm 进行 Python 开发时,会遇到安装第三方库失败的问题。本文将介绍如何解决这个问题。 解决方法 1. 检查连接 在安装第三方库时,需要确保网络连接正常。可以使用 ping 命令检查网络是否正常。示例代码如下: ping www.baidu.com 在上…

    python 2023年5月13日
    00
  • python语言的优势是什么

    以下是“Python语言的优势是什么”的完整攻略: 一、问题描述 Python是一种高级编程语言,具有简单易学、可读性强、功能强大等优点。本文将详细讲解Python语言的优势是什么。 二、解决方案 2.1 Python语言的优势 Python语言具有以下优势: 简单易学:Python语言的语法简单明了,易于学习和使用。Python语言的代码可读性强,代码结构…

    python 2023年5月14日
    00
  • Python计算信息熵实例

    Python计算信息熵实例 什么是信息熵? 信息熵是一个衡量信息传递的无序程度的指标,通常用来描述一个系统的不确定性。 对于离散型随机变量 $X$,其信息熵定义为: $$H(X) = -\sum_{i=1}^{n} p_i \log_2 p_i$$ 其中,$n$ 表示 $X$ 可能取值的个数,$p_i$ 表示 $X$ 取第 $i$ 个值的概率。 如何用Pyt…

    python 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部