1

关于 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(),无论其内容如何,​​每隔几百毫秒更新微调器图形,然后从中断的地方继续?

我已经用进度模块尝试过这个,但没有运气......我什至无法让示例代码工作,它在我开始迭代后就挂了,直到我 Ctrl+C 退出。

4

2 回答 2

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运行时,加载消息会定期更新。一旦完成,线程就会加入,加载消息将替换为已完成的消息。

于 2017-06-30T17:38:50.193 回答
1

您可能想要使用线程 ( import threading)。启动一个打印您spinner.begin()的消息的线程,然后让您的黑盒运行,然后使用队列( )或其他东西spinner.end()向线程发送完成消息,线程并继续执行您正在执行的操作。from Queue import Queuejoin()

作为一种设计选择,将打印隐藏在更深的地方,而不是与开始和结束调用相同的代码块中。

于 2017-06-30T17:29:51.127 回答