3

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

tqdm 还有一个用于 Jupyter notebooks ( tqdm_notebook()) 的小部件,允许一个漂亮的“web-ish”进度条。

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

code.py从常规 python 环境(即Ipython, IDLE, shell)运行时,我希望 tqdm 以正常形式运行:

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

但是当我导入code.pyJupyter 时,我希望它使用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 外壳(例如在 Spyder 或 IDLE 中)。

4

2 回答 2

5

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

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

from tqdm.autonotebook import tqdm
tqdm.pandas()

请注意,这将发出TqdmExperimentalWarningif run in a notebook ,因为它无法区分 jupyter notebook 和 jupyter 控制台。使用 auto 而不是 autonotebook 来抑制此警告。

于 2019-06-11T15:34:09.380 回答
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应该是:

if any('jupyter' in arg for arg in sys.argv):
    from tqdm import tqdm_notebook as tqdm
else:
   from tqdm import tqdm
于 2017-07-07T15:54:24.833 回答