当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()
?或者,是否有一个黑客暂停blackbox()
,无论其内容如何,每隔几百毫秒,更新微调器图形,然后从中断处继续?
我用progress模块尝试了这个但是没有运气......我甚至无法让示例代码工作,它在我开始迭代之后挂起,直到我按Ctrl + C'd进行。
答案 0 :(得分:2)
线程可能是最简单的方法。这是一个非常简化的版本,应该得到重点。我不确定你是否真的拥有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
运行时,加载消息会定期更新。完成后,线程将被连接,加载消息将替换为已完成的消息。
答案 1 :(得分:1)
您可能想要使用线程(import threading
)。让spinner.begin()
启动一个打印邮件的线程,然后让你的黑盒子运行,然后让spinner.end()
使用队列(from Queue import Queue
)或其他东西join()
向线程发送完成消息1}}线程并继续做你做的任何事情。
作为设计选择,将打印件隐藏在更深处,而不是与开始和结束调用相同的代码块。