我想在ipython会话中使用%run重复调用Python脚本,并根据通过%run传递的cmdline参数来记录每个脚本。
例如,在调试cmd.py时,我可能会想要运行:
%run cmd.py
... logs with default behavior, e.g. to STDERR with root level WARN
%run cmd.py --log_level DEBUG --log_file /tmp/cmd.out
... logs with root level DEBUG to a file
%run cmd.py --log_level ERROR
不幸的是,这很困难,因为logging.basicConfig创建的日志记录状态在第一个%run命令之后仍然存在(对于所有模块更常见,并且在使用%run时通常是可取的。)
我意识到完全通用的一系列%run命令与在新进程中运行每个命令不同。但是,如果可以重新初始化log_level和log_file之类的东西,那将非常方便。
我在cmd.py中尝试过类似的东西:
import logging_config # parse logging config from sys.argv
reload(logging_config) # re-parse cmdline if using %run multiple times
和logging_config.py执行(压缩):
if logging_initialized:
logging.getLogger().setLevel(lvl)
else:
logging.basicConfig(level=lvl)
logging_initialized = True
它适用于简单的情况,但如果cmd.py导入也使用日志记录的库则不行。我也尝试过logging.shutdown()(在每个cmd.py结束时调用),但这似乎没有帮助。
答案 0 :(得分:4)
不要将 basicConfig()用于这种使用方式 - 它用于简单的一次性配置,并且正如文档所述,在第一次调用之后的后续调用没有效果(它只是任何事情,如果根记录器没有处理程序)。当您的脚本从shell提示符运行时,这将是正常的,但不是来自交互式解释器,IPython,IDLE,PythonWin或其他与您交互的进程不会退出的类似环境。
相反,使用编程配置,或 fileConfig()或 dictConfig() - 这些模式可以完全用新的日志配置替换现有的日志配置。