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

什么';这是在python脚本中实现--quiet选项的简单方法,python,Python,我正在编写一个命令行python脚本—在整个脚本中,我有很多信息要打印到终端窗口,以便跟踪正在发生的事情 使用OptionParser我想添加一个--quiet选项,以便使所有输出静音。我正在寻找一种pythonic的方法来在整个脚本中实现这一点,这样我就不会做类似于: if not QUIET: # global variable set by OptionParser print " my output " 我是python新手,确信有更好的方法。想法 为什么不根据程序是否处于静默

我正在编写一个命令行python脚本—在整个脚本中,我有很多信息要打印到终端窗口,以便跟踪正在发生的事情

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

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

我是python新手,确信有更好的方法。想法

为什么不根据程序是否处于静默模式修改输出函数,以便只进行一次检查

if QUIET:
    def DoOutput(stuff):
        pass
else:
    def DoOutput(stuff):
        print(stuff)
或者,您当然可以在输出函数中检查
QUIET

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

您所描述的情况实际上是Python3将
print
从关键字更改为实际功能的原因之一:人们的大型项目变得非常依赖
print
作为关键字,然后当需要修改输出记录方式时,需要进行大规模重构;而当
print
是一个合适的函数时,您可以重新定义它,例如,
print(foo)
将输出到日志文件。这就是为什么更好的做法是将输出/日志打包到实际函数中,而不是让
print
分散在脚本中。

如果您想让它快速而脏,并且想要删除所有输出,那么将stdout和stderr重定向到/dev/null。付诸表决:

sys.stdout = open("/dev/null", "a") sys.stderr = open("/dev/null", "a") sys.stdout=open(“/dev/null”,“a”) sys.stderr=open(“/dev/null”,“a”) 在检测点--quiet。

如果
quiet
的日志级别不同,则可以使用并分配那些不应打印的内容

Edit:显示了一个如何执行此操作的示例,假设如果设置了
QUIET
,则所有输出都应该是静默的。请注意,在Python 3中,不需要使用来自未来的导入打印函数:

print = logging.info
logging.basicConfig(level=logging.WARNING if QUIET else logging.INFO,
                    format="%(message)s")
对于不应被
--quiet
静音的重要输出,定义例如
iprint

iprint = logging.warning

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

可以将输出作为
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)

您可以将stdout替换为一个代理,该代理过滤对write或writeline的调用:

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

我只是简单地看了一下
日志记录
——这是否意味着,我可以将文本消息发送到
日志记录
,然后(在
\uuuuuuu main\uuuuuuuuu
中,确定消息是“打印”的、保存到文件中的,还是完全静音?thornomad-答案是yes@thornomad您可以通过文件或代码配置记录器。这样您就可以决定输出的主要位置。这可能会破坏程序在没有cygwin的情况下在windows上运行的任何机会,不是吗它?Windows没有/dev/null。最好使用
os.devnull
-这将根据操作系统提供“/dev/null”或“nul”。
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)