Я хотел бы делать повторные вызовы сценариев Python, используя% run в сеансе ipython, и для каждого из этих сценариев вести журнал на основе аргументов cmdline, передаваемых через% run.
Например, во время отладки 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), но это, похоже, не помогает.