модуль обновления при импорте в интерпретатор Python

Короче

Как заставить интерпретатор Python загружать самую последнюю версию кода моего модуля каждый раз, когда я вношу некоторые изменения в код модуля?

Или хотя бы перезагрузите последнюю измененную версию, набрав

>>> from myModule import *

в консоль, без необходимости перезапускать всю консоль Python и настраивать все снова и снова каждый раз, когда я вношу какие-то изменения? Это крайне неприятное поведение для отладки.

--------- БОЛЬШАЯ ИСТОРИЯ -----------

Я пытался удалить файл .pyc и снова импортировать его, но это не помогло. Он даже не создает файл .pyc снова, поэтому я ожидаю, что он полностью проигнорирует мою команду «импорт», если модуль уже загружен.

это тоже не помогает:

>>> mymodule.myfunc()    # the old version
>>> del myModule         # unload mymodle from python conole / interpeter
...                  # now I removed .pyc
...                  # now I make some modifications in mymodule.myfunc() code   
>>> mymodule.myfunc()    # module is unknonwn, ... OK
>>> import myModule      # try to load modified version
>>> mymodule.myfunc()    # stil the old version :(((((, How it can remember?

Я также пробовал Spyder, где эта функция называется "Удаление пользовательских модулей (UMD)" http://pythonhosted.org/spyder/console.html#reloading-modules-the-user-module-deleter-umd, который, как я думал, должен делать именно так, но вроде нет (да, я проверил, что он включен).

Может быть, я что-то упускаю - может кто-нибудь объяснить мне, как это должно использоваться?

На это как-то влияет тот факт, что импортированный модуль находится не в «Рабочем каталоге», а в PYTHONPATH?


person Prokop Hapala    schedule 27.06.2013    source источник
comment
Хорошо, я только что обнаружил, что reload(mymodule) выполняет эту работу. Но все же, 1) можно ли сделать его как-то автоматическим? 2) На что годится UMD, если не на это?   -  person Prokop Hapala    schedule 27.06.2013
comment
relaod не работает для меня. Я изменяю файл в редакторе, а затем сохраняю его. затем я перезагружаю (ModuleName) в консоли и запускаю обновленный метод из модуля, и я получаю старый метод. только запуск модуля из редактора (F5) фактически обновляет модуль. любой совет?   -  person idoda    schedule 16.12.2013
comment
@idoda То же самое для меня. Вы нашли решение?   -  person endolith    schedule 03.09.2017


Ответы (2)


(здесь разработчик Spyder) Я думаю, что на данный момент вы не можете перезагрузить модуль прямо в консоли (но мы рассматриваем возможность изменить это в будущем).

Идея UMD заключается в том, что он перезагрузит ваши модули, но только если вы запустите файл из редактора, который их импортирует. Это не работает, если вы хотите перезагрузить их прямо в консоли.

Допустим, вы разработали модуль, тогда вы, вероятно, используете его в другом скрипте, который (скорее всего) вы напишете в нашем редакторе и отправите для запуска на нашу консоль. UMD — это немного волшебства, которое перезагружает его для вас, когда это происходит.

person Carlos Cordoba    schedule 27.06.2013
comment
Привет, я немного исследовал эту проблему, и кажется, что нет надежного способа обновить модуль из интерпретатора Python. Вот почему мы предоставляем наш UMD, и для его использования вам просто нужно сделать любой вызов вашего модуля из скрипта. - person Carlos Cordoba; 31.12.2013
comment
Как включить UMD? Он включен по умолчанию? - person Dima Lituiev; 17.11.2015
comment
Да, он включен по умолчанию, но вы можете отключить его в Tools > Preferences > Console > Advanced settings > User Module Reloader - person Carlos Cordoba; 17.11.2015
comment
В Spyder3: Настройки => Интерпретатор Python => Включить UMR - person TommasoF; 28.12.2016
comment
Spyder3 у меня не работает. Я меняю одну вещь в functions.py и пытаюсь импортировать их снова, но старый код запускается. это очень раздражает - person Peter.k; 03.11.2017
comment
@ Peter.k, вам нужно запустить файл с помощью F5, чтобы ваши изменения были обновлены. - person Carlos Cordoba; 04.11.2017

Может быть полезно для других. В Spyder 3.0.0 модули можно перезагружать,

Инструменты -> Обновить список имен модулей.

Это сработало для меня.

person s_u_f    schedule 29.08.2017