将stdout重定向到控制台和文件,设置详细程度开关
我写了一些代码来练习在Python中使用详细输出。详细输出是通过ArgumentParser
模块来实现的。不过,我还想在关闭详细输出时,也把stdout
(标准输出)写入文件:
#!/usr/bin/python
import sys
def printable1():
print "1"
def printable2():
print "2"
def printable3():
print "3"
def Main1():
printable1()
printable2()
def Main2():
printable2()
printable3()
class Logger(object):
def __init__(self):
self.terminal = sys.stdout
self.log = open("logfile2.log", "a")
def write(self, message):
self.terminal.write(message)
self.log.write(message)
if __name__ == "__main__":
from argparse import ArgumentParser
parser = ArgumentParser(description='PC Test',version="1.0")
parser.add_argument('--nopc',action='store_true', help='Do not perform test on the PC')
parser.add_argument('--pc', action='store_true', help='Do perform test on the PC')
# VERBOSITY
parser.add_argument('--vmode', dest='verbose', action='store_true',
help='Enable printing of status messages to stdout.')
args = parser.parse_args()
sys.stdout = Logger()
if args.verbose:
if args.pc:
Main1()
elif args.nopc:
Main2()
else:
Main1()
Main2()
这段代码只有在使用--vmode
参数开启详细输出时,才会把标准输出写入文件。你能帮我找到一个解决方案吗?
1 个回答
1
与其重新发明轮子,不如使用logging模块来处理终端打印和文件写入。关于输出的详细程度,还是要看你自己的需求:
import logging
import logging.handlers
log = logging.getLogger(__name__)
log.addHandler(logging.StreamHandler()) # Prints to console.
log.addHandler(logging.handlers.RotatingFileHandler('logfile2.log'))
log.setLevel(logging.INFO) # Set logging level here.
从现在开始,你可以在脚本中使用这个普通的log
对象来进行日志记录,这样记录的信息会同时发送到控制台和文件中:
log.info('test')
log.warning('test')
另外,我建议使用ConfigDict来处理日志记录器和处理器的注册——这是一种更直观的方式(不过你还是需要像上面那样实例化log
对象)。