Jupyter 笔记本的 tqdm 失败
tqdm failure with Jupyter Notebook
tqdm
是我最喜欢的 Python 软件包之一,但我有一个恼人的问题,并试图弄清楚这是否是我的错。
虽然 运行 使用 Jupyter Notebook
的 tqdm
循环并遇到 RunTime Error
恢复真的很难 - 修复错误并重新运行循环会导致 多行打印,而不是tqdm
原始单行。返回的唯一方法是重新启动内核,这不是很有用。
还有其他解决方案吗?
我无法故意重现该问题,但这里有一个可能导致该问题的示例代码:
from tqdm import trange
s=0
for i in trange(100):
s+=i
if i==10:
raise ValueError
然后重新运行单元格。
为了克服这个问题,我使用了以下条件 import
,它在 Jupyter Notebook 中可能 运行 或 控制台中的代码中起作用(并且如果不是 运行 交互,什么也不做):
# progress.py
import sys
def tqdm(iterable, **kwargs):
"""Fake progress function."""
return iterable
# check if running notebook and use notebook backend for tqdm progress bar
if 'IPython' in sys.modules:
from IPython import get_ipython
from IPython.display import display_javascript, Javascript
from tqdm import tqdm
ip = get_ipython()
if 'IPKernelApp' in ip.config:
monkey_patch = f"""
from tqdm import tqdm_notebook as tqdm
import {__name__} as module
module.tqdm = tqdm
"""
monkey_patch = ';'.join(x.strip() for x in monkey_patch.strip().split('\n'))
display_javascript(Javascript(f"""IPython.notebook.kernel.execute("{monkey_patch}");"""))
然后使用它:
$ jupyter console # or ipython3
In [1]: import progress
In [2]: list(progress.tqdm(range(10)))
100%|██████████| 10/10 [00:00<00:00, 120873.31it/s]
Out[2]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
tqdm
是我最喜欢的 Python 软件包之一,但我有一个恼人的问题,并试图弄清楚这是否是我的错。
虽然 运行 使用 Jupyter Notebook
的 tqdm
循环并遇到 RunTime Error
恢复真的很难 - 修复错误并重新运行循环会导致 多行打印,而不是tqdm
原始单行。返回的唯一方法是重新启动内核,这不是很有用。
还有其他解决方案吗?
我无法故意重现该问题,但这里有一个可能导致该问题的示例代码:
from tqdm import trange
s=0
for i in trange(100):
s+=i
if i==10:
raise ValueError
然后重新运行单元格。
为了克服这个问题,我使用了以下条件 import
,它在 Jupyter Notebook 中可能 运行 或 控制台中的代码中起作用(并且如果不是 运行 交互,什么也不做):
# progress.py
import sys
def tqdm(iterable, **kwargs):
"""Fake progress function."""
return iterable
# check if running notebook and use notebook backend for tqdm progress bar
if 'IPython' in sys.modules:
from IPython import get_ipython
from IPython.display import display_javascript, Javascript
from tqdm import tqdm
ip = get_ipython()
if 'IPKernelApp' in ip.config:
monkey_patch = f"""
from tqdm import tqdm_notebook as tqdm
import {__name__} as module
module.tqdm = tqdm
"""
monkey_patch = ';'.join(x.strip() for x in monkey_patch.strip().split('\n'))
display_javascript(Javascript(f"""IPython.notebook.kernel.execute("{monkey_patch}");"""))
然后使用它:
$ jupyter console # or ipython3
In [1]: import progress
In [2]: list(progress.tqdm(range(10)))
100%|██████████| 10/10 [00:00<00:00, 120873.31it/s]
Out[2]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]