代码之家  ›  专栏  ›  技术社区  ›  thornomad

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

  •  14
  • thornomad  · 技术社区  · 15 年前

    正在处理命令行python脚本-在整个脚本中,我有很多信息 print -到了终点站的窗口,这样我就可以跟随着发生的事情。

    使用 OptionParser 我想添加一个 --quiet 选项,这样我可以使所有输出静音。我正在寻找一种贯穿整个脚本的蟒蛇式方法,以便 不要 最后会做如下的事情:

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

    我对python不熟悉,肯定有更好的方法。思想?

    6 回复  |  直到 15 年前
        1
  •  27
  •   Community Dunja Lalic    7 年前

    你可以使用 logging 分配那些不应该打印的东西,如果 QUIET 不同的日志级别。

    编辑: THC4K's answer 显示了一个如何执行此操作的示例,假设所有输出在 安静的 被设置。注意在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
    
        2
  •  11
  •   Jochen Ritzel    15 年前

    可以沉默 全部的 通过将其作为 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 )
    
        3
  •  2
  •   Mark Rushakoff    15 年前

    为什么不根据程序是否处于安静模式来修改输出函数,所以只检查一次?

    if QUIET:
        def DoOutput(stuff):
            pass
    else:
        def DoOutput(stuff):
            print(stuff)
    

    或者,你当然可以把支票 QUIET 在输出函数内部:

    def DoOutput(stuff):
        if QUIET:
            print(stuff)
    

    您所描述的情况实际上是Python3发生变化的原因之一。 print 从关键字到实际功能:人们的大型项目越来越依赖于 打印 作为一个关键字,当需要修改输出的记录方式时,需要进行大量的重构;而当 打印 是一个适当的函数,您可以重新定义它,以便 print(foo) 例如,将输出到日志文件。这就是为什么最好将输出/日志打包到实际函数中,而不是 打印 分散在你的剧本上。

        4
  •  1
  •   Dave Kirby    15 年前

    您可以用一个代理来替换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不同),并且它仍然适用于您无法控制的第三方库中的打印语句。 您还可以进一步完善它,以便对所写内容提供更精确的控制,例如添加时间戳,或将打印语句重定向到日志系统。

        5
  •  0
  •   tyranid    15 年前

    如果你想快点把它弄脏,想把它扔掉 全部的 输出然后将stdout和stderr重定向到/dev/null。放置:

    sys.stdout = open("/dev/null", "a")
    sys.stderr = open("/dev/null", "a")
    

    在你发现的地方——安静。

        6
  •  0
  •   yu_sha    15 年前
    if QUIET:
       sys.stdout=open("/dev/null","w")
    ...
    print 'my output'
    

    在Windows上,使用“nul”而不是“/dev/null”