不同 python 环境中的 tqdm 变化

tqdm variations in different python enviroments

我正在使用在 python 中显示进度条的 tqdm 包。

tqdm 还有一个用于 Jupyter 笔记本的小部件 (tqdm_notebook()),允许一个漂亮的 "web-ish" 进度条。

我的问题是 code.py 文件中有一个 tqdm 进度条,我将其导入 jupyter notebook。

虽然 运行从常规 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区分环境?

我发现 this post 建议检查 get_ipython().__class__.__name__'ipykernel' in sys.modules 但它不区分笔记本和其他 Ipython 外壳(例如 Spyder 或 IDLE)。

显然,使用 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 中的导入语句应该是:

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

tqdm 现在有一个 autonotebook 模块。来自 doc:

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

from tqdm.autonotebook import tqdm
tqdm.pandas()

请注意,这将在笔记本中发出 TqdmExperimentalWarning if 运行,因为无法区分 jupyter notebook 和 jupyter console。 使用 auto 而不是 autonotebook 来抑制此警告。