关于在执行Python脚本时终端中显示进度条的问题很多,但是每个问题都基于一个循环,您可以在该循环中执行操作,然后更新进度图形。

不幸的是,我要显示其功能的函数(或至少一个微调器对象以表明其正在运行)是一个黑匣子,我无法(至少实际上,实际上不应)对其进行更改。本质上,我想做的是:

#pseudocode input
print('Loading')
spinner.begin()
blackbox() #a few thousand operations happen in here
spinner.end()
print('Finished')

#pseudocode output
Loading.
Loading..
Loading...
Loading.
Loading..
Loading...
Finished


尽管理想情况下,这应该是省略号的动画,而不是打印多行。但是,在我甚至还不能开始构建愚蠢的ascii动画之前,有一个主要障碍:

有没有办法同时运行spinnerblackbox()?或者,是否有hack程序可以每隔几百毫秒暂停一次blackbox(),而不管其内容如何,​​更新微调器图形,然后从中断处恢复?

我已经使用progress模块进行了尝试,但是没有运气...我什至无法使示例代码正常工作,它只是在我开始迭代直到Ctrl + C退出后才挂起。

最佳答案

线程可能是完成此工作的最简单方法。这是一个经过简化的版本,应该可以理解这一点。我不确定您是否真正具有spinner功能,所以我自己做了。

import threading
import time

def blackbox():
    time.sleep(10)

thread = threading.Thread(target=blackbox)
thread.start()

eli_count = 0
while thread.is_alive():
    print('Loading', '.'*(eli_count+1), ' '*(2-eli_count), end='\r')
    eli_count = (eli_count + 1) % 3
    time.sleep(0.1)
thread.join()
print('Done      ')


因此,当blackbox运行时,加载消息会定期更新。完成后,将加入线程并将加载消息替换为已完成的消息。

07-28 06:33