Дополнительно
Как выгрузить (перезагрузить) модуль?
У меня есть давно работающий сервер Python, и я хотел бы иметь возможность обновить службу без перезапуска сервера. Как лучше всего это сделать?
if foo.py has changed:
unimport foo <-- How do I do this?
import foo
myfoo = foo.Foo()
756
18
Вы можете перезагрузить модуль, если он уже был импортирован, с помощью встроенной функции
reload
:В Python 3 функция
reload
была перенесена в модульimp
. В версии 3.4imp
был упразднен в пользуimportlib
, а к последнему был добавленreload
. При использовании 3 или более поздних версий, либо ссылайтесь на соответствующий модуль при вызовеreload
, либо импортируйте его.Я думаю, что это то, что вам нужно. Веб-серверы, такие как Django'development server, используют это, чтобы вы могли видеть эффекты изменений вашего кода без перезапуска самого серверного процесса.
Цитирую из документации:
Как вы отметили в своем вопросе, вам придется перестроить объекты
Foo
, если классFoo
находится в модулеfoo
.В Python 3.0–3.3 можно использовать:
чертенок.перезагрузка(модуля)
В BDFL и ответы этот вопрос.
Однако,
чертенок
была отменена в 3.4, в пользуimportlib
(спасибо @Стефан!).Я думаю, поэтому ты теперь использовать
importlib.перезагрузка(модуля)
, хотя я не уверен.Особенно трудно удалить модуль, если он не является чистым Python.
Вот некоторая информация из: Как реально удалить импортированный модуль?.
reload(module)
, но только если он полностью автономен. Если что-то еще имеет ссылку на модуль (или любой объект, принадлежащий модулю), то вы получите тонкие и любопытные ошибки, вызванные тем, что старый код висит дольше, чем вы ожидали, и такие вещи, какisinstance
не работают в разных версиях одного и того же кода.Если у вас есть односторонние зависимости, вы также должны перезагрузить все модули, которые зависят от перезагружаемого модуля, чтобы избавиться от всех ссылок на старый код. А затем рекурсивно перезагрузить модули, которые зависят от перезагруженных модулей.
Если у вас есть круговые зависимости, что очень часто встречается, например, при перезагрузке пакета, вы должны выгрузить все модули в группе за один раз. Вы не можете сделать это с помощью
reload()
, потому что он будет повторно импортировать каждый модуль до того, как его зависимости будут обновлены, что позволит старым ссылкам проникнуть в новые модули.Единственный способ сделать это в данном случае - взломать
sys.modules
, что вроде как не поддерживается. Вам придется пройтись и удалить каждую записьsys.modules
, которую вы хотите перезагрузить при следующем импорте, а также удалить записи, значения которых равныNone
, чтобы решить проблему реализации, связанную с кэшированием неудачных относительных импортов. Это не очень приятно, но пока у вас есть полностью самодостаточный набор зависимостей, который не оставляет ссылок за пределами своей кодовой базы, это вполне работоспособно.Возможно, лучше перезапустить сервер. :-)
Для Python 2 использовать встроенные функции перезагрузка():
Для Python 2 и 3.2–3.3 использовать перезагрузка от ИМП модуль:
Однако `бес`` устарел начиная с версии 3.4 в пользу importlib, так что используйте:
или
Следующий код позволит вам с Python 2/3 совместимости:
Вы можете использовать его как обновить () в обоих версиях, что делает вещи проще.
Принято отвечать не'т обрабатывать от случая х Импорт г. Этот код обрабатывает его и стандартном случае импорта, а также:
В случае перегрузки, то переназначить имен высшего уровня со значениями, хранящимися в недавно перезагрузка модуль, который обновляет их.
Это современный способ перезарядки модуля:
Если вы хотите поддержать версий Python старше 3.4, попробуйте это:
Если вы не в сервере, но developing и нужно часто перезагружать модуль, здесь'ы хороший совет.
Во-первых, убедитесь, что вы используете превосходный оболочки IPython, от проекта ноутбука Jupyter. После установки Jupyter, вы можете запустить его с оболочкой IPython
, или
консоли jupyter, или даже лучше, - jupyter qtconsole
, которая подарит вам хорошее консоль раскрашенная с функцией автозавершения кода в любой ОС.Теперь в командной строке, типа:
Теперь, каждый раз вы запускаете ваш скрипт, ваш модуль будет перезагружен.
За
2
, есть и другие опции автоматическая перезагрузка магия:Для тех вроде меня, кто хочет выгрузить все модули (при работе в интерпретаторе Python в разделе в Emacs):
Более подробная информация в модули перегрузочные в Python.
Те, кто с помощью Python 3 и перезагрузить с importlib.
Если у вас есть такие проблемы, как кажется, что модуль не'т... перезагрузит это потому, что она нуждается в некотором времени, чтобы перекомпилировать ЧКД (до 60 сек).Я пишу это просто намек, что вы знаете, если вы столкнулись с этой проблемой.
Разработки enthought черты имеет модуль, который достаточно хорошо работает для этого. https://traits.readthedocs.org/en/4.3.0/_modules/traits/util/refresh.html
Это позволит загрузить любой модуль, который был изменен, и обновление других модулей и изменяющиеся объекты, которые используют его. Он не работает большую часть времени с__очень_частная__` методов, и может подавиться наследование классов, но это спасает меня безумное количество времени до перезапуска приложения при написании PyQt GUI, как и материал, который проходит внутри таких программ, как Maya или Nuke. Это вовсе't работа может быть 20-30 % времени, но она's все еще невероятно полезно.
Разработки enthought's пакет не'т перезагрузить файлы в момент их изменения - вы должны вызвать его явно, но что должно'т быть все, что трудно осуществить, если вы действительно в ней нуждается
2018-02-01
фу
должны быть успешно импортированы заранее.,
перезагрузка(ФОО)`31.5. importlib — осуществление импортно — документации по языку Python 3.6.4
Другой вариант. Вижу, что Python по умолчанию `importlib.релоад будет просто импортировать библиотеку передается в качестве аргумента. Это выиграл'т обновить библиотеки, что вашу библиотеку импорта. Если вы сменили много файлов и иметь довольно сложный пакет для импорта, вы должны сделать глубокая перезагрузка.
Если у вас есть оболочкой IPython или Jupyter установлен, вы можете использовать функцию глубокой перезагрузки все библиотеки:
Если вы Don'т иметь Jupyter, установите его с помощью следующей команды в командной строке:
для меня в случае комплекса Abaqus это, как это работает. Представьте, что ваш файл находится Class_VerticesEdges.py
Я получил много неприятностей пытается обновить что-то внутри возвышенный текст, но я смог наконец-то написал эту программу, чтобы обновить модули на возвышенное текст на основе кода sublime_plugin.py` используется для перезарядки модулей.
Ниже можно загрузить модули из путей с пробелами на их имена, потом после перезагрузки вы можете просто импортировать, как вы это обычно делаете.
Если вы работаете в первый раз, для этого надо загрузить модуль, но если позже вы можете снова run_tests метод/функция
()
это будет перезагрузить файлы тестов. С возвышенное текст (питон 3.3.6
) это происходит много, потому что его переводчик никогда не закрывается (только если вы перезапустите возвышенное текст, т. е.Питон3.3
переводчик).Другой способ может быть, чтобы импортировать модуль в функции. Таким образом, когда функция завершает модуль подвергается сборке мусора.