在不同的Python环境中,tqdm的变化情况

3
我正在使用python中的tqdm包来显示进度条。
tqdm还有一个在Jupyter笔记本中使用的小部件(tqdm_notebook()),可以展示漂亮的“网页式”进度条。
我的问题是,我在code.py文件中有一个tqdm进度条,我将它导入到jupyter笔记本中。
当我从常规Python环境(即IpythonIDLEshell)运行code.py时,我希望tqdm以正常形式运行:
from tqdm import tqdm
a = 0
for i in tqdm(range(2000)):
   a+=i

但当我将code.py导入到Jupyter中时,我希望它使用tqdm_notebook()函数:

from tqdm import tqdm_notebook as tqdm
a = 0
for i in tqdm(range(2000)):
   a+=i

如何让Python区分不同的环境?

我发现这篇文章建议检查get_ipython().__class__.__name__'ipykernel' in sys.modules,但它不能区分笔记本和其他IPython shell(例如Spyder或IDLE)。

2个回答

5

tqdm现在有一个autonotebook模块。根据文档

可以使用autonotebook子模块,让tqdm自动选择控制台或笔记本版本:

from tqdm.autonotebook import tqdm
tqdm.pandas()

请注意,如果在笔记本中运行,则会发出“TqdmExperimentalWarning”警告,因为不可能区分jupyter笔记本和jupyter控制台。使用“auto”而不是“autonotebook”来抑制此警告。

2
显然,使用sys.argv可以帮助解决这个问题。
import sys
print sys.argv

在 Jupyter 中运行此代码将具有以下参数:
['C:\\Users\\...\\lib\\site-packages\\ipykernel\\__main__.py',
 '-f',
 'C:\\Users\\...\\jupyter\\runtime\\kernel-###.json']

当然,从 shell/IDLE 运行时不会有 jupyter 行。

因此,在 code.py 中的 import 语句应该是:

if any('jupyter' in arg for arg in sys.argv):
    from tqdm import tqdm_notebook as tqdm
else:
   from tqdm import tqdm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接