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

yizhihongxing

实现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日

相关文章

  • 关于jupyter打开之后不能直接跳转到浏览器的解决方式

    针对这个问题,我将为您提供完整的攻略,包括两条示例说明。 问题描述 当我们在Windows系统中使用Jupyter Notebook打开一个笔记本文件时,有时会出现打开后不能直接跳转到浏览器的情况。通常情况下,我们的浏览器会自动打开一个选项卡,显示Jupyter Notebook的界面。但出现问题后,需要手动打开浏览器并输入地址才能访问Jupyter Not…

    python 2023年6月5日
    00
  • Python 记录日志的灵活性和可配置性介绍

    Python 记录日志的灵活性和可配置性介绍 Python 的 logging 模块是官方提供的日志记录模块,可以帮助我们快速方便地记录代码中的各种事件。它提供了很多种不同的日志记录方式,可以非常灵活地配置,满足不同应用场景的要求。 基本用法 使用 logging 模块非常简单,我们只需要导入模块,然后创建一个 logger 对象即可。使用 logger 对…

    python 2023年6月3日
    00
  • Python读取Excel数据并生成图表过程解析

    Python读取Excel数据并生成图表过程解析 在本文中,我们将详细讲解如何使用Python读取Excel数据并生成图表。具体来说,我们将使用Python中的pandas和matplotlib库来实现该过程。 步骤1:导入所需的库 首先,我们需要导入所需的库。 import pandas as pd import matplotlib.pyplot as …

    python 2023年5月13日
    00
  • 实操Python爬取觅知网素材图片示例

    觅知网是一个提供高质量素材下载的网站,包括图片、音频、视频等。本文将详细讲解如何使用Python爬取觅知网的素材图片,包括如何解析网页、如何下载图片等。 解析网页 要解析网页,我们可以使用requests库发送HTTP请求,使用BeautifulSoup库解析HTML响应数据。以下是一个示例,演示如何解析觅知网的素材图片网页: import requests…

    python 2023年5月15日
    00
  • python 中defaultdict()对字典进行初始化的用法介绍

    当我们使用 Python 内置的字典(dict)时,如果要给其中的某个键对应的值进行初始化操作,通常需要先判断该键是否已经存在,若不存在则需要向字典中添加该键,并给其对应的值初始化为指定的值。这样的操作会比较繁琐,不仅增加了代码量,而且可能会影响代码的可读性和可维护性。在这种情况下,可以使用 Python 标准库中 collections 模块提供的 def…

    python 2023年5月13日
    00
  • 对Python3 * 和 ** 运算符详解

    对Python3 * 和 ** 运算符详解 在Python3中,*和**运算符代表不同的意义。下面我们就来详细讲解这两个运算符。 *运算符 *运算符在Python中有多种用法,最常见的用法是将它用于序列类型数据的解包操作。 序列解包 如果想要将一个序列类型的数据拆分成多个单独的对象,可以使用*运算符。 示例代码: lst = [1, 2, 3, 4, 5] …

    python 2023年6月5日
    00
  • Python中str.format()方法的具体使用

    关于 Python 中str.format()方法的具体使用,我为您提供如下攻略: 前言 Python 中的str.format()方法是对字符串进行格式化输出的一种方法。使用这种方法可以将占位符替换成想要的值,比较灵活。 基本使用 格式化输出的格式类似于字符串模板,其中需要进行格式化的部分使用占位符 {} 来表示。例如,我们要对字符串进行格式化输出,可以使…

    python 2023年6月5日
    00
  • python实现读Excel写入.txt的方法

    下面我为你提供一份 Python 实现读 Excel 写入 txt 的完整实例教程。主要步骤如下: 步骤一:安装依赖库 在 Python 中读取和处理 Excel 文件需要安装第三方库,这里我们使用 pandas 和 openpyxl。可以通过以下命令来安装依赖库: pip install pandas openpyxl 步骤二:读取 Excel 文件 接下…

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