关于在执行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动画之前,有一个主要障碍:
有没有办法同时运行
spinner
和blackbox()
?或者,是否有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
运行时,加载消息会定期更新。完成后,将加入线程并将加载消息替换为已完成的消息。