小能豆

Python 进度条

javascript

当我的脚本正在执行一些可能需要时间的任务时,如何使用进度条?

例如,一个函数需要一些时间才能完成,True完成后返回。如何在函数执行期间显示进度条?

请注意,我需要实时实现这一点,所以我不知道该怎么做。我需要一个吗thread?我不知道。

目前,在执行函数时我没有打印任何内容,但如果有进度条就更好了。另外,我更感兴趣的是如何从代码的角度做到这一点。


阅读 56

收藏
2024-07-02

共1个答案

小能豆

要在执行耗时的函数时显示进度条,您可以使用库tqdm,这是一个用于在 Python 中显示进度条的流行库。您可以tqdm通过使用单独的线程或将任务分解为较小的块来与耗时的函数集成,以便您定期更新进度条。

使用单独的线程

下面是一个示例,说明如何在执行耗时函数时使用单独的线程来更新进度条:

  1. tqdm如果尚未安装该库,请安装:

bash pip install tqdm

  1. 创建一个使用线程并tqdm显示进度条的脚本:
   import time
   import threading
   from tqdm import tqdm

   def long_running_task():
       # Simulate a long-running task
       time.sleep(10)
       return True

   def progress_bar(stop_event):
       with tqdm(total=100, desc="Progress", position=0, leave=True) as pbar:
           while not stop_event.is_set():
               time.sleep(0.1)  # Update progress bar every 0.1 seconds
               pbar.update(1)
               if pbar.n >= 100:
                   pbar.n = 0
           pbar.close()

   if __name__ == "__main__":
       stop_event = threading.Event()

       # Start the progress bar thread
       progress_thread = threading.Thread(target=progress_bar, args=(stop_event,))
       progress_thread.start()

       # Run the long-running task
       result = long_running_task()

       # Stop the progress bar
       stop_event.set()

       # Wait for the progress bar thread to finish
       progress_thread.join()

       print(f"Task completed with result: {result}")
 ```

### 将任务分解成块

如果您可以将长时间运行的任务分解为较小的块或步骤,则可以在每个步骤更新进度条。以下是示例:

1. `tqdm`如果尚未安装该库,请安装:

```bash
   pip install tqdm
  1. 创建一个脚本,在每个步骤更新进度条:
   import time
   from tqdm import tqdm

   def long_running_task_with_steps(total_steps):
       for _ in tqdm(range(total_steps), desc="Progress"):
           time.sleep(1)  # Simulate a step taking time

   if __name__ == "__main__":
       total_steps = 10  # Number of steps in the long-running task
       long_running_task_with_steps(total_steps)

在此示例中,tqdm每次循环迭代时都会自动更新进度条。

解释

  • 单独线程方法
  • 单独的线程运行进度条更新逻辑。
  • 主线程运行长时间运行的任务。
  • 进度条线程定期更新进度条,直到任务完成。
  • 用于Event发出信号让进度条线程停止。
  • 分块任务方法
  • 长时间运行的任务被拆分成更小的步骤。
  • tqdm在循环的每个步骤中更新进度条。

这两种方法都允许您显示需要时间的任务的进度条,但是它们之间的选择取决于您是否可以将任务分解为更小的步骤或需要将任务作为一个整体运行。

2024-07-02