重定向sys.stdout
总是很棘手,并且当两个应用程序同时纠缠在一起时,它将变成一场噩梦。
这里的窍门是tqdm
默认情况下打印到sys.stderr
,而不是sys.stdout
。通常,tqdm
对于这两个特殊通道具有反混合策略,但是由于您正在重定向sys.stdout
,tqdm
因此由于文件句柄发生更改而感到困惑。
因此,您只需要显式指定file=sys.stdout
to即可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=True
的tqdm
。