Почему IDLE не создает новый файл журнала с модулем ведения журнала при повторном запуске?

#python

#python

Вопрос:

Я тестировал несколько простых примеров ведения журнала для модуля ведения журнала Python в IDLE:

 import logging

logging.basicConfig(level=logging.DEBUG,
    format='%(asctime)s %(levelname)s %(message)s', filename='TESTLOG.log')

logging.debug('A debug message')
  

И это работает как ожидалось: создается файл с именем TESTLOG.log и сообщением отладки.

Но если я удаляю файл журнала во время открытого окна сценария IDLE, то при повторной попытке запустить модуль / f5 новый файл журнала не создается. Если я закрою окно скрипта, а затем снова открою и запущу его, файл журнала будет создан.

И наоборот, если я запускаю скрипт из командной строки, файл журнала всегда создается после того, как я удаляю файл журнала и повторно запускаю скрипт.

В чем разница между двумя ситуациями?

Ответ №1:

При первом basicConfig вызове он добавляет обработчик к корневому регистратору в модуле ведения журнала. Последующие вызовы basicConfig проверяют, есть ли уже обработчик в корневом регистраторе, и если есть, то вызов basicConfig не имеет эффекта (т. Е. он не будет повторно создавать файл журнала).

Если вы открываете окно IDLE и запускаете свой скрипт, модуль ведения журнала загружается, и скрипт настраивает корневой регистратор с помощью его вызова basicConfig . Поскольку вы впоследствии не закрываете окно IDLE, модуль ведения журнала остается загруженным, и последующие вызовы basicConfig не оказывают никакого эффекта.

Закрытие и повторное открытие окна IDLE эффективно запускает новый экземпляр python, и модуль ведения журнала должен быть перезагружен, и поэтому вызов basicConfig имеет эффект. Аналогично, для запуска скрипта из командной строки требуется новый экземпляр python при каждом запуске скрипта.

Комментарии:

1. Спасибо. Это имеет смысл и помогает мне лучше понять модуль ведения журнала.

Ответ №2:

Вы не говорите, в какой операционной системе вы работаете, но я предполагаю, что это не Windows, поскольку вы не можете удалять открытые файлы в Windows. В Linux открытые файлы можно удалить, но файл висит до тех пор, пока все открытые дескрипторы к нему не будут закрыты, а затем исчезает. Это, похоже, согласуется с тем, что вы видите: в случае IDLE файл остается открытым до тех пор, пока выполняется IDLE, так что файл действительно все еще там, даже если вы его удалили, до завершения процесса IDLE. В случае сценариев они завершаются каждый раз, поэтому файл закрывается, и когда вы его удаляете, он действительно удаляется.