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年5月14日
    00
  • Python安装及Pycharm安装使用教程图解

    Python的安装教程: 安装Python 打开官网:https://www.python.org/ 选择“downloads”,找到与你的操作系统匹配的版本,点击下载 执行安装程序 Windows安装程序自带了Python的解释器,你可以通过命令提示符输入python,以确认是否安装成功。 对于Mac或Linux用户,需要在终端输入命令python –v…

    python 2023年5月14日
    00
  • Python程序中使用SQLAlchemy时出现乱码的解决方案

    当Python程序使用SQLAlchemy与数据库进行交互时,有时会出现中文字符乱码的问题。下面是解决方案的完整攻略: 问题分析 出现乱码的主要原因是程序读写数据库时编码格式不一致,导致无法正确地显示或读取中文字符。在使用SQLAlchemy时,需要确保程序采用的编码格式与数据库一致,才能避免中文字符乱码。 解决方案 解决中文字符乱码的方法是在代码中加入字符…

    python 2023年5月31日
    00
  • Python如何自定义邻接表图类

    当然,我很乐意为您提供“Python如何自定义邻接表图类”的完整攻略。以下是详细的步骤和示例: Python自定义邻接表图类的步骤 定义一个Graph类 定义一个Node类 在Graph类中定义添加节点和添加边的方法 在Graph类中定义遍历图的方法 1. 定义一个Graph类 我们可以使用Python中的类来定义一个Graph类,该类将包含图的所有信息和操…

    python 2023年5月13日
    00
  • python实现单机五子棋

    下面我将为你详细讲解“Python实现单机五子棋”的完整攻略。 1. 编写五子棋逻辑代码 首先,我们需要编写五子棋的逻辑代码。主要有以下步骤: 定义一个棋盘数据结构,可以用二维列表表示。 编写一个落子函数,用来在棋盘上放置棋子。 判断胜负的函数,要实现五子连珠的判断逻辑。 编写一个主程序,来调用上述函数,实现游戏的运行。 以下是示例代码: 定义棋盘数据结构 …

    python 2023年5月23日
    00
  • 使用python求解迷宫问题的三种实现方法

    使用Python求解迷宫问题的三种实现方法 迷宫问题是一个经典的寻路问题,目标是从起点到达终点,避免碰到障碍物。在这个攻略中,我们将介绍三种使用Python求解迷宫问题的实现方法:深度优先搜索、广度优先搜索和A*搜索。我们将提供两个示例说明如何使用这些算法来解决迷宫问题。 深度优先搜索 深度优先搜索是一种基于栈的搜索算法,它从起点开始,沿着一条路径一直走到底…

    python 2023年5月14日
    00
  • 在Python中对x点的切比雪夫级数进行评估

    要对x点的切比雪夫级数进行评估,可以使用Python中的SciPy库中的chebval函数。 chebval(x, c)函数是用于计算x点的c系数切比雪夫级数的值。其中,x是点的位置,c是切比雪夫级数的系数。 下面是一个简单的示例: from scipy import special # 定义切比雪夫级数的系数 c = [1, 2, 3] # 定义待评估的点…

    python-answer 2023年3月25日
    00
  • python del()函数用法

    当我们需要移除一个对象或删除一个变量时,python中提供了del()函数用于删除指定的对象或变量。它可以删除列表、字典、变量和任何其他对象类型。在本篇攻略中,我们将对del()函数的用法进行详细讲解,并且提供两个具体的示例。 标准的del()函数使用方法 del()函数可以用来删除有趣的变量,例如列表中的元素,对象属性和整个列表对象自身。 删除变量 当我们…

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