reload(module)
, но только если он полностью автономен. Если что-то еще имеет ссылку на модуль (или любой объект, принадлежащий модулю), то вы получите тонкие и любопытные ошибки, вызванные старым кодом, зависшим дольше, чем вы ожидали, и такими вещами, как isinstance
, не работающими в разных версии того же кода.
Если у вас есть односторонние зависимости, вы также должны перезагрузить все модули, которые зависят от перезагруженного модуля, чтобы избавиться от всех ссылок на старый код. А затем перезагрузите модули, зависящие от перезагруженных модулей, рекурсивно.
Если у вас есть циклические зависимости, что очень распространено, например, когда вы имеете дело с перезагрузкой пакета, вы должны выгрузить все модули в группе за один раз. Вы не можете сделать это с reload()
, потому что он будет повторно импортировать каждый модуль до обновления его зависимостей, позволяя старым ссылкам проникать в новые модули.
Единственный способ сделать это в этом случае - взломать sys.modules
, что не поддерживается. Вам нужно будет пройти и удалить каждую запись sys.modules
, которую вы хотите перезагрузить при следующем импорте, а также удалить записи со значениями None
, чтобы решить проблему реализации, связанную с кешированием неудачных относительных импортов. Это не очень приятно, но пока у вас есть полностью автономный набор зависимостей, который не оставляет ссылок вне своей кодовой базы, это выполнимо.
Вероятно, лучше перезагрузить сервер. : -)