在python脚本中实现--quiet选项的简单方法是什么

时间:2009-11-29 15:08:47

标签: python

正在使用命令行python脚本 - 在整个脚本中,我有很多信息,我print - 终端窗口,以便我可以跟进正在发生的事情。

使用OptionParser我想添加一个--quiet选项,这样我就可以将所有输出静音。我正在寻找一种pythonic方法来在整个脚本中实现这一点,以便我最终做类似的事情:

if not QUIET: # global variable set by OptionParser
    print " my output "

是python的新手,确定有更好的方法。想法?

6 个答案:

答案 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”