正在使用命令行python脚本 - 在整个脚本中,我有很多信息,我print
- 终端窗口,以便我可以跟进正在发生的事情。
使用OptionParser
我想添加一个--quiet
选项,这样我就可以将所有输出静音。我正在寻找一种pythonic方法来在整个脚本中实现这一点,以便我不最终做类似的事情:
if not QUIET: # global variable set by OptionParser
print " my output "
是python的新手,确定有更好的方法。想法?
答案 0 :(得分:27)
您可以使用logging
并指定QUIET
不同日志级别时不应打印的内容。
编辑: THC4K's answer显示了如何执行此操作的示例,假设如果设置了QUIET
,则所有输出都应该是静默的。请注意,在Python 3中from __future__ import print_function
不是必需的:
print = logging.info
logging.basicConfig(level=logging.WARNING if QUIET else logging.INFO,
format="%(message)s")
对于--quiet
不应沉默的重要输出,请定义,例如iprint
:
iprint = logging.warning
答案 1 :(得分:11)
可以通过将其输出为python myscript.py > /dev/null
更改脚本中的输出流:
if QUIET:
sys.stdout = open(os.devnull,'a')
sys.stderr = open(os.devnull,'a')
print something
使用不同的打印功能
from __future__ import print_function
if QUIET:
def print(*args):
pass
print( something )
使用日志记录和日志级别
from __future__ import print_function
import logging
logging.basicConfig(level=logging.INFO, format="%(message)s")
print = logging.info
if QUIET:
logging.basicConfig(level=logging.ERROR)
print( something )
答案 2 :(得分:2)
为什么不根据程序是否处于安静模式来修改输出功能,所以你只需要进行一次检查?
if QUIET:
def DoOutput(stuff):
pass
else:
def DoOutput(stuff):
print(stuff)
或者,您当然可以在输出函数中检查QUIET
:
def DoOutput(stuff):
if QUIET:
print(stuff)
您所描述的情况实际上是Python 3将print
从关键字更改为实际功能的原因之一:人们的大项目变得非常依赖print
作为关键字,当需要修改输出的记录时,需要进行大规模的重构;而当print
是一个正确的函数时,您可以重新定义它,以便print(foo)
输出到日志文件。这就是为什么最好将输出/日志记录包装在一个实际的函数中,而不是让print
分散在你的脚本中。
答案 3 :(得分:1)
您可以使用过滤调用write或writelines的代理替换stdout:
class FileProxy(object):
def __init__(self, real_file, quiet_flag):
self.real_file = real_file
self.quiet_flag = quiet_flag
def write(self, string):
if not self.quiet_flag:
self.real_file.write(string)
def writelines(self, strings):
if not self.quiet_flag:
self.real_file.write(strings)
def __getattr__(self, name):
return getattr(self.file, name)
import sys
sys.stdout = FileProxy(sys.stdout, QUIET)
这样做的好处是它是跨平台的(与写入/ dev / null不同),它仍然适用于您无法控制的第三方库中的print语句。 您还可以进一步优化它,以便更准确地控制所写的内容,例如:添加时间戳,或将print语句重定向到日志记录系统。
答案 4 :(得分:0)
如果你想要它快速而又脏,并且想要摆脱所有输出,那么将stdout和stderr重定向到/ dev / null。放:
sys.stdout = open("/dev/null", "a") sys.stderr = open("/dev/null", "a")
在您检测到的地方 - 安静。
答案 5 :(得分:0)
if QUIET:
sys.stdout=open("/dev/null","w")
...
print 'my output'
在Windows上,使用“nul”而不是“/ dev / null”