Pie*_*sen 24 python progress-bar tqdm
我正在python中进行一个小型命令行游戏,我正在使用tqdm模块显示进度条.我使用msvcrt模块监听用户输入以中断进度.一旦中断,用户可以通过在命令行提示符中输入"restart"来重新启动.第二次显示进度条,而不是使用进度更新同一行,它每次都会创建一个新行.
我如何才能在同一条线上显示进度?
此代码段说明了我对进度条的使用.
def transfer():
for i in tqdm.tqdm(range(1000), desc="Transfer progress", ncols=100, bar_format='{l_bar}{bar}|'):
sleep(.1)
if msvcrt.kbhit():
if msvcrt.getwche() == ' ':
interrupt()
break
def interrupt():
type("File transfer interrupted, to restart the transfer, type 'restart'")
Run Code Online (Sandbox Code Playgroud)
RAH*_*ARI 43
我经常遇到这个问题,有时position = 0&leave = True不起作用。所以,我找到了一种替代方法。您可以使用tqdm.auto.tqdm
代替tqdm.tqdm
或
代替
from tqdm import tqdm
Run Code Online (Sandbox Code Playgroud)
尝试使用
from tqdm.auto import tqdm
Run Code Online (Sandbox Code Playgroud)
Lau*_*IER 22
不推荐使用tqdm_notebook。您必须改用tq.notebook.tqdm。
import tqdm.notebook as tq
for i in tq.tqdm(...):
Run Code Online (Sandbox Code Playgroud)
此外,tqdm_notebook 在性能方面确实很糟糕。新库完全纠正了这一点。
Jaq*_*har 18
from tqdm import tqdm_notebook
Run Code Online (Sandbox Code Playgroud)
此命令适用于 google colab。
Jos*_*nte 15
我已经意识到在再次使用 tqdm 之前关闭 tqdm 实例修复了在 Jupyter Lab 的新行中打印状态栏的问题:
while len(tqdm._instances) > 0:
tqdm._instances.pop().close()
Run Code Online (Sandbox Code Playgroud)
或者更好,感谢 Nirmal 的建议:
tqdm._instances.clear()
Run Code Online (Sandbox Code Playgroud)
Sci*_*iPy 11
尝试position=0和leave=True
(解决方案可在Google Colab中使用,以避免打印到换行符)
from tqdm import tqdm
import time
def foo_():
time.sleep(0.3)
range_ = range(0, 10)
total = len(range_)
with tqdm(total=total, position=0, leave=True) as pbar:
for i in tqdm((foo_, range_ ), position=0, leave=True):
pbar.update()
Run Code Online (Sandbox Code Playgroud)
tqdm如果您在 Colab 或 Jupyter Notebook 上使用时遇到此问题,那么...
使用笔记本/colab版本tqdm
>>> from tqdm.notebook import trange, tqdm
>>> for i in trange(1000):
... ...
Run Code Online (Sandbox Code Playgroud)
小智 6
尝试使用tqdm.tqdm.write代替标准print()
这将打印在进度条上方并将进度条移动到下方一行。
我使用下面的代码对此进行了测试,按下space将打印到标准输出但不会中断循环。您想要实现的目标并不是 100% 清楚,因为您的interrupt()函数仅检查所提供字符串的类型。type() 内置函数
import tqdm
import msvcrt
from time import sleep
def transfer():
for i in tqdm.tqdm(range(1000), desc="Transfer progress", ncols=100, bar_format='{l_bar}{bar}|'):
sleep(.1)
if msvcrt.kbhit():
if msvcrt.getwche() == ' ':
interrupt()
# break
def interrupt():
tqdm.tqdm.write("File transfer interrupted, to restart the transfer, type 'restart'", end="")
transfer()
Run Code Online (Sandbox Code Playgroud)
编辑:包括Paul Netherwood tqdm.tqdm.write()指出的
end参数tqdm.write()
除了上述position=0, leave=True参数之外,在我的例子中,经过几次迭代后,tqdm的默认参数也在新行上打印。ascii=False通过查看进度条,您可以轻松识别是否属于这种情况:如果进度条中有任何格式奇怪的符号(例如问号),您应该尝试使用ascii=True.
所以这对我有用:
from tqdm.auto import tqdm
...
with tqdm(data, position=0, leave=True, ascii=True) as iterator:
for x in iterator:
# do stuff
...
iterator.set_postfix_str(msg)
Run Code Online (Sandbox Code Playgroud)