#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. В случае сценариев они завершаются каждый раз, поэтому файл закрывается, и когда вы его удаляете, он действительно удаляется.