¿Cómo restablecer completamente el módulo de registro de Python stdlib en una sesión de ipython?

Me gustaría hacer llamadas repetidas a scripts de Python usando% run en una sesión de ipython, y para que cada uno de esos scripts se registre en base a los argumentos de cmdline pasados ​​a través de% run.

Por ejemplo, al depurar cmd.py, con el tiempo, es posible que desee ejecutar:

%run cmd.py ... logs with default behavior, eg 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 

Desafortunadamente, esto es difícil porque el estado de registro creado por logging.basicConfig persiste después del primer comando% run (como ocurre generalmente con todos los módulos, y a menudo es deseable cuando se usa% run).

Me doy cuenta de que, en general, una serie de comandos% run como los anteriores no serán lo mismo que ejecutar cada comando en un nuevo proceso. Sin embargo, sería muy conveniente si se pudieran reinicializar cosas como log_level y log_file.

He intentado algo como esto en cmd.py:

 import logging_config # parse logging config from sys.argv reload(logging_config) # re-parse cmdline if using %run multiple times 

y logging_config.py hace (condensado):

 if logging_initialized: logging.getLogger().setLevel(lvl) else: logging.basicConfig(level=lvl) logging_initialized = True 

Funciona para casos simples, pero no si cmd.py importa bibliotecas que también usan el registro. También he experimentado con logging.shutdown () (llamado al final de cada cmd.py) pero eso no parece ayudar.

No use basicConfig () para este estilo de uso; está diseñado para una configuración única y, como dice la documentación, las llamadas posteriores después de la primera no tienen ningún efecto (solo hace algo si el registrador raíz no tiene manejadores). Esto estará bien cuando su script se ejecute desde el indicador de comandos del shell, pero no desde el intérprete interactivo, IPython, IDLE, PythonWin u otro entorno similar donde el proceso con el que está interactuando no termina.

En su lugar, use la configuración programática, o fileConfig () o dictConfig () ; estos tienen modos en los que reemplazan completamente la configuración de registro existente por una nueva.