将stdout重定向到控制台和文件,设置详细程度开关

0 投票
1 回答
1095 浏览
提问于 2025-04-17 20:27

我写了一些代码来练习在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对象)。

撰写回答