您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

通过tqdm.write()在python脚本中重定向打印命令

通过tqdm.write()在python脚本中重定向打印命令

重定向sys.stdout总是很棘手,并且当两个应用程序同时纠缠在一起时,它将变成一场噩梦。

这里的窍门是tqdm认情况下打印到sys.stderr,而不是sys.stdout。通常,tqdm对于这两个特殊通道具有反混合策略,但是由于您正在重定向sys.stdouttqdm因此由于文件句柄发生更改而感到困惑。

因此,您只需要显式指定file=sys.stdoutto即可tqdm使用:

from time import sleep

import contextlib
import sys

from tqdm import tqdm

class DummyFile(object):
  file = None
  def __init__(self, file):
    self.file = file

  def write(self, x):
    # Avoid print() second call (useless \n)
    if len(x.rstrip()) > 0:
        tqdm.write(x, file=self.file)

@contextlib.contextmanager
def nostdout():
    save_stdout = sys.stdout
    sys.stdout = DummyFile(sys.stdout)
    yield
    sys.stdout = save_stdout

def blabla():
  print("Foo blabla")

# tqdm call to sys.stdout must be done BEFORE stdout redirection
# and you need to specify sys.stdout, not sys.stderr (default)
for _ in tqdm(range(3), file=sys.stdout):
    with nostdout():
        blabla()
        sleep(.5)

print('Done!')

我还增加了一些技巧,让输出更好的(例如,没有无用的\n使用时print()end='')。

/编辑:其实好像你可以做stdout启动后重定向tqdm,您只需要指定dynamic_ncols=Truetqdm

python 2022/1/1 18:35:44 有271人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶