有没有办法让Python在没有包含像下面这样的函数调用的情况下使stdout静音?
原始破码:
from sys import stdout
from copy import copy
save_stdout = copy(stdout)
stdout = open('trash','w')
foo()
stdout = save_stdout
Run Code Online (Sandbox Code Playgroud)
编辑:更正了Alex Martelli的代码
import sys
save_stdout = sys.stdout
sys.stdout = open('trash', 'w')
foo()
sys.stdout = save_stdout
Run Code Online (Sandbox Code Playgroud)
这种方式有效,但似乎非常低效.有有是一个更好的办法.有任何想法吗?
我正在尝试运行一个脚本,试图通过puppet管理在centos7系统上安装模块.我想为运行脚本时发生的安装实现进度条.我正在使用tqdm模块来执行此操作.这是我如何实现模块的一个快照:
from tqdm import tqdm
for i in tqdm(commands):
res = run_apply(i)
Run Code Online (Sandbox Code Playgroud)
这里run_apply()是实际处理运行和应用puppet配置的函数.
到目前为止一切顺利,我得到了一个进度条,但是当执行消息写入控制台时,它一直向下移动到控制台.但是,我需要进度条在控制台的底部保持不变并动态更新,而不会使运行消息干扰条形码.我希望控制台上与执行相关的消息可以随心所欲地进行,但进度条应该从执行开始到结束时保持在底部.
以下是我所看到的:
File line: 0.00
Package: 0.05
Service: 0.19
File: 0.23
Exec: 0.23
Last run: 1470308227
Config retrieval: 3.90
Total: 4.60
Version:
Config: 1470308220
Puppet: 3.7.3
now here x
result: 2
38%|?????????????????????????????????????? | 5/13 [00:29<00:51, 6.44s/it]about to: profiles::install::download_packages
about to run puppet apply --summarize --detailed-exitcodes --certname puppet -e "include profiles::install::download_packages"
Error: Could not find class profiles::install::download_packages for puppet on node puppet
Error: Could not find class profiles::install::download_packages …
Run Code Online (Sandbox Code Playgroud) 我有以下Python 3代码:
from tqdm import tqdm
print("Before")
for _ in tqdm(range(10)): pass
print("After")
Run Code Online (Sandbox Code Playgroud)
我希望得到以下输出到终端:
Before
100%|##########| 10/10 [00:00<?, ?it/s]
After
Run Code Online (Sandbox Code Playgroud)
但是,我得到的是:
100%|##########| 10/10 [00:00<?, ?it/s]
Before
After
Run Code Online (Sandbox Code Playgroud)
即打印输出相对于我的代码以错误的顺序结束.我也试过在调用sys.flush
之前和之后调用print
,只是为了得到以下输出:
Before
100%|##########| 10/10 [00:00<?, ?it/s]After
Run Code Online (Sandbox Code Playgroud)
另外,改变print
对tqdm.write
行为没有任何影响.
为什么它以这种意想不到的方式表现?
编辑:这个问题是关于在tqdm循环之前或之后使用print函数的特定情况.还有其他类似的问题是关于在 tqdm循环中打印消息,而在这种情况下并非如此.