首页 > 编程语言 >python之七彩进度条rich.progress

python之七彩进度条rich.progress

时间:2024-07-25 18:41:33浏览次数:12  
标签:code async python asynctor url rich import progress

Spinner

中国有七彩云南,Python有七彩进度条rich.progress.Progress

#!/usr/bin/env python
from contextlib import contextmanager
from typing import Generator

# pip install asynctor httpx rich
import asynctor
import httpx
from rich.progress import Progress, SpinnerColumn


@contextmanager
def spinnerbar(
    msg: str, color: str = "cyan", transient=True
) -> Generator[None, None, None]:
    """Spinner风格的七彩进度条

    :param msg: 进度条描述文字
    :param color: 颜色,如:'blue'
    :param transient: 任务完成后是否清除进度条信息
    """
    with Progress(
        SpinnerColumn(), *Progress.get_default_columns(), transient=transient
    ) as progress:
        progress.add_task(f"[{color}]{msg}...", total=None)
        yield


@asynctor.timeit
async def fetch(url) -> int:
    async with httpx.AsyncClient(verify=False, follow_redirects=True) as client:
        r = await client.get(url)
    return r.status_code


async def main() -> None:
    url = "https://pypi.org"
    with spinnerbar(f"Fetching {url}", transient=False):
        status_code = await asynctor.timeit(fetch)(url)
    print(f"{status_code = }")
    url = "https://fastapi.tiangolo.com/"
    with spinnerbar(f"Fetching {url}", color="green"):
        status_code = await fetch(url)
    print(f"{url = }; {status_code = }")


if __name__ == "__main__":
    asynctor.run(main)

虽然看不出具体进度,但起码知道程序正在运行,而不是卡死或挂掉:

Percent Bar

  • main.py
#!/usr/bin/env python
from contextlib import asynccontextmanager
from typing import AsyncGenerator

# pip install asynctor httpx rich
import anyio
import asynctor
import httpx
from rich.progress import Progress


@asynccontextmanager
async def percentbar(
    msg: str, seconds=5, color: str = "cyan", transient=False
) -> AsyncGenerator[None, None]:
    """Spinner风格的七彩进度条

    :param msg: 进度条描述文字
    :param seconds: 任务总时长
    :param color: 颜色,如:'blue'
    :param transient: 任务完成后是否清除进度条信息
    """
    total = seconds * 100

    async def play(progress, task, expected=1 / 2, thod=0.8):
        # 改变进度条速率,前面1/2的时间完成80%的进度
        cost = seconds * expected
        quick = int(total * thod)
        delay = cost / quick
        for i in range(quick):
            await anyio.sleep(delay)
            progress.advance(task)
        cost = seconds - cost
        slow = total - quick
        delay = cost / slow
        for i in range(slow):
            await anyio.sleep(delay)
            progress.advance(task)

    with Progress(transient=transient) as progress:
        task = progress.add_task(f"[{color}]{msg}:", total=total)
        async with anyio.create_task_group() as tg:
            tg.start_soon(play, progress, task)
            yield
            tg.cancel_scope.cancel()
            progress.update(task, completed=total)


@asynctor.timeit
async def fetch(url: str, timeout: int = 5) -> int:
    async with httpx.AsyncClient(
        timeout=timeout, verify=False, follow_redirects=True
    ) as client:
        r = await client.get(url)
    return r.status_code


async def main() -> None:
    url = "https://pypi.org/search/?q=asynctor"
    async with percentbar(f"Fetching {url}"):
        status_code = await asynctor.timeit(fetch)(url)
    print(f"{status_code = }")
    url = "https://fastapi.tiangolo.com/"
    async with percentbar(f"Fetching {url}", seconds=8, color="green", transient=True):
        status_code = await fetch(url, timeout=8)
    print(f"{url = }; {status_code = }")


if __name__ == "__main__":
    asynctor.run(main)
  • Result

这个进展虽然不一定正确反映任务进度,但起码让人知道任务正在向前推进着,也大概知道什么时候能完成。

标签:code,async,python,asynctor,url,rich,import,progress
From: https://www.cnblogs.com/waketzheng/p/18323907

相关文章

  • python运行报警告:Cython directive 'language_level' not set, using '3str' for now
    相关:https://stackoverflow.com/questions/34603628/how-to-specify-python-3-source-in-cythons-setup-pycython的setup.py文件内容:fromdistutils.coreimportsetupfromCython.Buildimportcythonizesetup(name='GreatCirclemodulev1',ext_modu......
  • SSM-网络课程系统-29230(免费领源码+开发文档)可做计算机毕业设计JAVA、PHP、爬虫、APP
    SSM网络课程系统摘 要本论文主要论述了如何使用SSM框架开发一个网络课程系统,将严格按照软件开发流程进行各个阶段的工作,采用B/S架构Java技术,面向对象编程思想进行项目开发。在引言中,将论述网络课程系统的当前背景以及系统开发的目的,后续章节将严格按照软件开发流程,对系统......
  • 如何在 python 日志记录中插入换行符?
    importlogginglogging.basicConfig(level=logging.DEBUG,format='%(asctime)s%(levelname)s%(message)s',datefmt='%H:%M:%S')logging.info('hello')logging.warning('\nnewhello')11:15:01INFOhello11:16......
  • 7:Python 变量类型
    Python 变量类型变量是存储在内存中的值,这就意味着在创建变量时会在内存中开辟一个空间。基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中。因此,变量可以指定不同的数据类型,这些变量可以存储整数,小数或字符。变量赋值Python中的变量赋值不需要......
  • 如何诊断和修复 python .\app.py 不工作
    我在vscode中激活了我的虚拟环境。在激活我的环境的PowerShell中,我成功安装了Flask。然后我在文件main.py中运行此代码:fromflaskimportFlaskapp=Flask(__name__)@app.route('/')defhello_world():return'Hello,World!'if__name__=="__main__":......
  • 【pywpsrpc/Python】改变图片宽高报错 对象无效属性: ‘tuple‘ object has no attrib
    概要开发UOS环境下,使用Python通过pywpsrpc库操作word文档在指定段落添加指定宽高的图片时意外发现的该问题,在原作者的github提问后获得解答后记录(源码地址、对应提问链接以及相关资料链接贴在文章末尾)。原因及解决方式首先贴一段简单的代码,作用是新建一个word文档并在其......
  • Python - 如何使用存储在类变量中的类型作为同一类方法的参数的类型提示?
    考虑下面的代码:fromtypingimportProtocol,ClassVar,AnyclassTool(Protocol):t:ClassVar#deff(self,params:self.t)->Any:#NameError:name'self'isnotdefineddeff(self,params)->Any:passclassSum:......
  • 从Python列表中提取值
    代码图片我只想从.dat文件中提取单个值,到目前为止,我已经成功提取了我想要的值,但我将各个字符串添加在一起。它非常笨重,所以寻找一种更平滑的方法,它只会给我行中的第一个值(-300)。谢谢代码:current_dir=os.getcwd()work_dir="\workDir"......
  • 如何从另一个 python 文件运行一个 python 文件
    我正在尝试从另一个python运行一个python文件,但是当涉及到调用另一个python文件中的方法时,它只会重新运行当前的python文件。我尝试了这段代码。我将导入放入log_user_in方法中,因为如果我将其导入到文件顶部,则会出现循环导入错误。这是我的代码片段fromtkinter......
  • 如何在Mac电脑上安装Python 2
    Python是一种高级编程语言,广泛应用于数据科学、网络开发、人工智能等领域。本文将介绍如何在Mac电脑上安装Python2,帮助初学者快速入门。一、下载Python2安装包在Python官网上下载Python2的安装包,网址为https://www.python.org/downloads/release/python-2718/ 。下载完......