Python 记录 streamHandler() 和 input() 之间的控制台干扰
Python console interference between logging streamHandler() and input()
我是 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() 函数覆盖它。
在 'yes' 响应之后,我记录了一条警告 'Overwriting existing directory'。
连续两次调用 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
>?
第二个输入行(来自第二个函数调用)在第一个函数调用发出警告之前打印到控制台。事实上,它也出现在第二次调用中的第一条日志消息之前。
为什么会这样?我该如何解决?它不会使我的代码无法使用,但很麻烦。日志流处理程序是否太慢而无法跟上其余代码?
另外,由于我是新手,欢迎就我的工作方式提出任何其他反馈。
谢谢!
input
将其提示写入标准输出,而日志记录则写入标准错误。这两个流是独立的,并且可以不可预测地交错。
或者:
- 将记录调用替换为
print
、
- 将您的日志记录配置为转到 stdout 而不是 stderr,或者
- 在可重用函数中将
input(prompt)
替换为 print(prompt, file=sys.stderr, end=''); input()
。
我是 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() 函数覆盖它。 在 'yes' 响应之后,我记录了一条警告 'Overwriting existing directory'。
连续两次调用 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
>?
第二个输入行(来自第二个函数调用)在第一个函数调用发出警告之前打印到控制台。事实上,它也出现在第二次调用中的第一条日志消息之前。
为什么会这样?我该如何解决?它不会使我的代码无法使用,但很麻烦。日志流处理程序是否太慢而无法跟上其余代码? 另外,由于我是新手,欢迎就我的工作方式提出任何其他反馈。
谢谢!
input
将其提示写入标准输出,而日志记录则写入标准错误。这两个流是独立的,并且可以不可预测地交错。
或者:
- 将记录调用替换为
print
、 - 将您的日志记录配置为转到 stdout 而不是 stderr,或者
- 在可重用函数中将
input(prompt)
替换为print(prompt, file=sys.stderr, end=''); input()
。