【问题标题】:Redirection of stdout to console and file with verbosity turned on or off将标准输出重定向到控制台和打开或关闭详细程度的文件
【发布时间】:2023-04-02 05:40:01
【问题描述】:

我写了一些代码只是为了在 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 参数启用详细程度时,此代码才会将标准输出写入文件。你能帮我找到解决办法吗?

【问题讨论】:

  • 我已经清理了你的代码,只包含相关的行(删除所有的注释代码、额外的空格和未使用的导入);如果您的示例仅包含重现问题所需的代码,我们可以更轻松地为您提供帮助。
  • 谢谢你 Martjin,我会在以后处理它。我再次道歉。

标签: python stdout verbosity


【解决方案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 对象)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-15
    • 1970-01-01
    • 2019-11-17
    • 2015-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多