我正在使用 Jupyter 小部件编写一个界面,用户在其中配置一堆设置,然后单击“运行”按钮。单击后,此按钮将调用另一个模块中实现的函数。该函数需要一些时间才能运行,因此我使用该包向其添加了一个进度条tqdm。不幸的是,当我单击“运行”时,此进度条现在显示在另一个终端中,而不是在单元格的输出中。有没有办法让条形图显示在同一单元格输出中?
是否可以将 tqdm 栏从
\n[Step 1]: 100%|\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88 | 109/109 [00:03<00:00, 32.46it/s]\nRun Code Online (Sandbox Code Playgroud)\n类似的东西
\n[Step 1]: 100%[==========================> ] 109/109 [00:03<00:00, 32.46it/s]\nRun Code Online (Sandbox Code Playgroud)\n 从 Docker 容器内部来看,tqdm在其自己的线程上运行时似乎出现了一些问题。
我尝试了其他进度条(例如alive-progress),但它们都失败了。当在容器外部运行时,相同的代码可以完美地工作。这似乎是 Docker 特有的问题,很可能是一个docker-compose问题,但我无法发现问题。有什么建议吗?
编辑:docker run -it console_test 有效。肯定是配置有问题docker-compose.yml。
重现步骤:
console_test/console.py:
import threading
import time
import tqdm
import sys
print("Starting the test")
def job():
for i in tqdm.tqdm(range(50)):
time.sleep(0.1)
sys.stdout.flush() # this has no effect
# print("Hi") # this is printed though!
print("Finished.")
job_thread = threading.Thread(target=job)
job_thread.start()
while 1:
time.sleep(1)
Run Code Online (Sandbox Code Playgroud)
console_test/Dockerfile:
# Using official python runtime base image
FROM python:3.8.9
RUN pip install tqdm …Run Code Online (Sandbox Code Playgroud) Tqdm 文档显示了 tqdm 使用 Progress_apply 处理 pandas apply 的示例。我从这里https://tqdm.github.io/docs/tqdm/改编了以下代码,该代码通常需要几分钟才能执行(func1 是一个正则表达式函数)。
from tqdm import tqdm
tqdm.pandas()
df.progress_apply(lambda x: func1(x.textbody), axis=1)
Run Code Online (Sandbox Code Playgroud)
生成的进度条不显示任何进度。它只是从循环开始时的 0 跳到循环结束时的 100。我当前正在运行 tqdm 版本 4.61.2
我正在尝试运行一个非常简单的 tqdm 脚本:
from tqdm.notebook import tqdm
for i in tqdm(range(10)):
time.sleep(1)
Run Code Online (Sandbox Code Playgroud)
但我遇到了:
IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html
Run Code Online (Sandbox Code Playgroud)
我的 ipywidgets 是 v8.0.4,jupyter v1.0.0...tqdm 不再与 VS Code Jupyter Notebook 一起使用吗?
我正在使用tqdm显示进度条,同时完成了一些长期运行的Django管理命令。它很好用(很容易使用!),但是...
当我对代码运行单元测试时,我想停止输出进度条。而且,如果我使用cron或其他某种方式在后台运行这些命令,我也希望进度条不在输出中。
我看不到做这两种事情的简便方法,但是也许我错过了什么?
tqdm并且dask是在Python迭代都惊人的包。在tqdm实现所需的进度条的同时,dask实现了多线程平台,它们都可以使迭代过程更轻松。但是-我很难将它们结合在一起。
例如,以下代码dask使用tqdm.trange进度条在中实现了延迟执行。事实是,由于delayed迅速执行,进度条立即结束,而真正的计算时间工作则在compute零件中完成。
from dask import delayed,compute
from tqdm import trange
from time import sleep
ct = time()
result= []
def fun(x):
sleep(x)
return x
for i in trange(10):
result.append(delayed(fun)(i))
print compute(result)
Run Code Online (Sandbox Code Playgroud)
如何将进度条附加到compute命令的实际执行中?
以下简单代码使用tqdm在迭代循环时显示进度条:
import tqdm
for f in tqdm.tqdm(range(100000000)):
if f > 100000000/4:
break
Run Code Online (Sandbox Code Playgroud)
执行中断时失败:
$ python test.py
24%|????? | 24425076/100000000 [00:03<00:11, 6550673.18it/s]
Exception KeyError: KeyError(<weakref at 0x7fb8799f1158; to 'tqdm' at 0x7fb8799de190>,) in ignored
Run Code Online (Sandbox Code Playgroud)
我使用的是Python v2.7.6和tqdm v4.32.1:
$ python --version
Python 2.7.6
$ python -m tqdm --version
4.23.1
Run Code Online (Sandbox Code Playgroud)
我在互联网上寻找类似的错误,没有任何积极的结果.
来自https://pypi.org/project/tqdm/:
import pandas as pd
import numpy as np
from tqdm import tqdm
df = pd.DataFrame(np.random.randint(0, 100, (100000, 6)))
tqdm.pandas(desc="my bar!")p`
df.progress_apply(lambda x: x**2)
Run Code Online (Sandbox Code Playgroud)
我接受了这段代码并对其进行了编辑,以便从load_excel创建一个DataFrame而不是使用随机数:
import pandas as pd
from tqdm import tqdm
import numpy as np
filename="huge_file.xlsx"
df = pd.DataFrame(pd.read_excel(filename))
tqdm.pandas()
df.progress_apply(lambda x: x**2)
Run Code Online (Sandbox Code Playgroud)
这给了我一个错误,所以我将df.progress_apply更改为:
df.progress_apply(lambda x: x)
Run Code Online (Sandbox Code Playgroud)
这是最终代码:
import pandas as pd
from tqdm import tqdm
import numpy as np
filename="huge_file.xlsx"
df = pd.DataFrame(pd.read_excel(filename))
tqdm.pandas()
df.progress_apply(lambda x: x)
Run Code Online (Sandbox Code Playgroud)
这会产生一个进度条,但实际上并没有显示任何进度,而是加载进度条,并且当操作完成时,它会跳到100%,无法达到目的。
我的问题是:如何使进度条起作用?
progress_apply内部的函数实际上是做什么的?
有没有更好的方法?也许是tqdm的替代品?
任何帮助是极大的赞赏。
我正在尝试使用收集的异步任务的 tqdm 进度条。
希望在完成任务后逐步更新进度条。试过代码:
import asyncio
import tqdm
import random
async def factorial(name, number):
f = 1
for i in range(2, number+1):
await asyncio.sleep(random.random())
f *= i
print(f"Task {name}: factorial {number} = {f}")
async def tq(flen):
for _ in tqdm.tqdm(range(flen)):
await asyncio.sleep(0.1)
async def main():
# Schedule the three concurrently
flist = [factorial("A", 2),
factorial("B", 3),
factorial("C", 4)]
await asyncio.gather(*flist, tq(len(flist)))
asyncio.run(main())
Run Code Online (Sandbox Code Playgroud)
...但这只是完成了 tqdm 条,然后处理阶乘。
有没有办法在每个 asyncio 任务完成后让进度条移动?
tqdm ×10
python ×9
ipywidgets ×2
pandas ×2
progress-bar ×2
cron ×1
dask ×1
django ×1
docker ×1
excel ×1
jupyter-lab ×1