При разработке большого проекта (разбитого на несколько файлов и папок) на Python с помощью IPython я столкнулся с проблемой кэшированных импортированных модулей.
Проблема в том, что команды import module
читают модуль только один раз, даже если этот модуль изменился! Поэтому каждый раз, когда я что-то меняю в своем пакете, я должен выйти и перезапустить IPython. Болезненные.
Есть ли способ принудительно перезагрузить некоторые модули? Или, лучше, чтобы каким-то образом запретить Python кэшировать их?
Я попробовал несколько подходов, но никто не работает. В частности, я сталкиваюсь с действительно, действительно странными ошибками, например, некоторыми модулями или переменными, таинственно становясь равными None
...
Единственный разумный ресурс, который я нашел, - Перезагрузка модулей Python, из pyunit, но я его не проверял. Я хотел бы что-то подобное.
Хорошей альтернативой было бы перезапуск IPython или каким-то образом перезапустить интерпретатор Python.
Итак, если вы разрабатываете в Python, какое решение вы нашли для этой проблемы?
Edit
Чтобы все было ясно: очевидно, я понимаю, что некоторые старые переменные, зависящие от предыдущего состояния модуля, могут остаться. Это прекрасно. Почему в 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, есть ли у меня мой модуль в одном большом файле или в нескольких подмодулях? Почему этот подход не работает?