Перезагрузить (обновить) файл модуля в интерпретаторе

Скажем, у меня есть этот 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