При разработке крупного проекта (разделенного на несколько файлов и папок) в Python с использованием IPython я столкнулся с проблемой импортированных в кеширование модулей.
Проблема в том, что инструкция import module
читает модуль только один раз, даже если этот модуль изменился! Поэтому каждый раз, когда я что-то меняю в своем пакете, мне приходится выходить и перезапускать IPython. Болезненные.
Можно ли как-нибудь принудительно перезагрузить некоторые модули? Или, лучше, как-то помешать Python кешировать их?
Я пробовал несколько подходов, но ни один не работает. В частности, я сталкиваюсь с очень, очень странными ошибками, например, некоторые модули или переменные загадочно становятся равными None
...
Единственный разумный ресурс, который я нашел, это Перезагрузка модулей Python , из pyunit, но я его не проверял. Я хотел бы что-то подобное.
Хорошей альтернативой будет перезапуск IPython или перезапуск интерпретатора Python.
Итак, если вы разрабатываете на Python, какое решение вы нашли для этой проблемы?
Редактировать
Чтобы прояснить ситуацию: очевидно, я понимаю, что некоторые старые переменные в зависимости от предыдущего состояния модуля могут остаться. Это нормально для меня. Почему в Python так сложно принудительно перезагрузить модуль без каких-либо странных ошибок?
Точнее говоря, если у меня весь модуль целиком в одном файле module.py
, то отлично работает следующее:
import sys
try:
del sys.modules['module']
except AttributeError:
pass
import module
obj = module.my_class()
Этот кусок кода прекрасно работает, и я могу разрабатывать, не выходя из IPython в течение нескольких месяцев.
Однако , когда мой модуль состоит из нескольких подмодулей, ад вырывается:
import os
for mod in ['module.submod1', 'module.submod2']:
try:
del sys.module[mod]
except AttributeError:
pass
# sometimes this works, sometimes not. WHY?
Почему для Python так сильно отличается мой модуль в одном большом файле или в нескольких подмодулях? Почему этот подход не работает ??