【问题标题】:Python console interference between logging streamHandler() and input()记录 streamHandler() 和 input() 之间的 Python 控制台干扰
【发布时间】:2022-01-12 03:06:13
【问题描述】:

我是 python 新手。将日志模块的 streamHandler() 输出与 input() 行一起使用时,我在控制台输出中遇到了一点麻烦。

我使用以下功能配置我的记录器:

def configure_logger(filename='log'):
    """Configures a logger which outputs at level INFO and above to both
    the console and a file called 'filename'.
    """
    
    file_handler = logging.FileHandler(filename, mode='w')
    stream_handler = logging.StreamHandler()
    file_formatter = logging.Formatter(datefmt="%d/%m/%Y %H:%M:%S",
                                       fmt='%(levelname)-8s %(asctime)s '
                                           '%(name)-50s - %(message)s')
    stream_formatter = logging.Formatter(fmt='%(levelname)-8s %(name)-50s - '
                                             '%(message)s')
    file_handler.setFormatter(file_formatter)
    stream_handler.setFormatter(stream_formatter)
    logging.basicConfig(handlers=(file_handler, stream_handler),
                        level=logging.INFO)

后来我连续两次调用下面的函数来创建两个目录:

def create_directory(directory):
    """Creates a directory, prompting the user to confirm overwrite if
    it already exists
    """
    
    logger = logging.getLogger(f'{__name__}.create_directory')
    logger.info(f'Creating directory {directory}')
    
    try:
        os.mkdir(directory)
    except FileExistsError:
        overwrite = input(f'Directory {directory} already '
                          f'exists. Overwrite? (y/n): ')
        overwrite.lower()
        while overwrite not in ['y', 'yes', 'n', 'no']:
            overwrite = input(f'Enter yes/y or no/n?: ')
            overwrite.lower()
        if overwrite in ['y', 'yes']:
            logger.warning('Overwriting existing directory')
            shutil.rmtree(directory)
            os.mkdir(directory)
        else:
            logger.info("Exiting")
            sys.exit()

如果我尝试创建的目录已经存在,我会提示用户并要求他们确认是否要使用 input() 函数覆盖它。 在回答“是”之后,我会记录一个警告“覆盖现有目录”。

连续两次调用 create_directory() 后,我在控制台中得到以下信息:

INFO     sowfatools.create_directory                        - Creating directory time_histories
Directory time_histories already exists. Overwrite? (y/n): >? y
Directory time_history_plots already exists. Overwrite? (y/n): WARNING  sowfatools.create_directory                        - Overwriting existing directory
INFO     sowfatools.create_directory                        - Creating directory time_history_plots

>?

第二个输入行(来自第二个函数调用)在第一个函数调用发出警告之前打印到控制台。事实上,它也出现在第二次调用中的第一条日志消息之前。

为什么会这样?我该如何解决?它不会使我的代码无法使用,但这很麻烦。日志流处理程序是否太慢而无法跟上其余代码? 另外,由于我是新手,欢迎对我的工作方式提出任何其他反馈。

谢谢!

【问题讨论】:

    标签: python logging input console


    【解决方案1】:

    input 将其提示写入标准输出,而日志则写入标准错误。这两个流是独立的,可以不可预测地交错。

    要么:

    1. 将日志调用替换为print
    2. 将您的日志配置为转到 stdout 而不是 stderr,或者
    3. 在可重用函数中将 input(prompt) 替换为 print(prompt, file=sys.stderr, end=''); input()

    【讨论】:

    • 太棒了,谢谢!我选择在我的configure_logger() 函数中使用stream_handler = logging.StreamHandler(stream=sys.stdout) 将我的记录器输出更改为标准输出。这很有魅力。
    猜你喜欢
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多