Запретить Python кэшировать импортированные модулиPython

Программы на Python
Ответить
Anonymous
 Запретить Python кэшировать импортированные модули

Сообщение Anonymous »

При разработке большого проекта (разделенного на несколько файлов и папок) на Python с использованием IPython я столкнулся с проблемой кэширования импортированных модулей.

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

Подробнее здесь: https://stackoverflow.com/questions/291 ... ed-modules
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»