Перезагрузить (обновить) файл модуля в интерпретаторе
Скажем, у меня есть этот python script script.py
, и я загружаю его в интерпретаторе, набрав
import script
а затем я выполняю свою функцию, набрав:
script.testFunction(testArgument)
Хорошо, так хорошо, но когда я изменяю script.py
, если я пытаюсь снова импортировать, то script не обновляется. Мне нужно выйти из интерпретатора, перезапустить интерпретатор и затем импортировать новую версию script, чтобы он работал.
Что мне делать вместо этого?
Ответы
Ответ 1
Вы можете создать reload script
, но это не будет обновлять существующие объекты и не будет углубляться внутри других модулей.
К счастью, это разрешено IPython
- лучшей оболочкой python, которая поддерживает автоматическую перезагрузку.
Чтобы использовать автозагрузку в IPython
, вам сначала нужно набрать import ipy_autoreload
или поместить его навсегда в ~/.ipython/ipy_user_conf.py
.
Затем запустите:
%autoreload 1
%aimport script
%autoreload 1
означает, что каждый модуль, загруженный с помощью %aimport
, будет перезагружен перед выполнением кода из приглашения. Однако это не будет обновлять существующие объекты.
Смотрите http://ipython.org/ipython-doc/dev/config/extensions/autoreload.html для более интересных вещей, которые вы можете сделать.
Ответ 2
http://docs.python.org/library/functions.html#reload
перезарядка (модуль)
Загрузите ранее импортированный модуль. Аргумент должен быть объектом модуля, поэтому он должен быть успешно импортирован ранее. Это полезно, если вы отредактировали исходный файл модуля, используя внешний редактор и хотите попробовать новую версию, не выходя из интерпретатор Python. Возвращаемое значение - это объект модуля ( как и аргумент модуля).
Ответ 3
Альтернативным решением, которое мне очень помогло, является сохранение копии ключей sys.modules
и появление новых модулей после импорта для принудительного повторного импорта глубокого импорта:
>>> oldmods = set(sys.modules.keys())
>>> import script
>>> # Do stuff
>>> for mod in set(sys.modules.keys()).difference(oldmods): sys.modules.pop(mod)
>>> import script