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