перезагрузить (обновить) файл модуля в интерпретаторе - PullRequest
13 голосов
/ 20 сентября 2010

Допустим, у меня есть этот скрипт на python script.py, и я загружаю его в интерпретатор, набрав

import script

, а затем я выполняю свою функцию, набрав:

script.testFunction(testArgument)

OKпока все хорошо, но когда я изменяю script.py, если я пытаюсь импортировать снова, скрипт не обновляется.Я должен выйти из интерпретатора, перезапустить интерпретатор и затем импортировать новую версию скрипта, чтобы он работал.

Что мне вместо этого делать?

Ответы [ 3 ]

11 голосов
/ 20 сентября 2010

Вы можете выдать 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 для более забавных вещей, которые вы можете сделать.

7 голосов
/ 20 сентября 2010

http://docs.python.org/library/functions.html#reload

перезагрузить (модуль)

Перезагрузить ранее импортированный модуль.Аргумент должен быть объектом модуля, поэтому он должен быть успешно импортирован ранее.Это полезно, если вы отредактировали исходный файл модуля с помощью внешнего редактора и хотите опробовать новую версию, не выходя из интерпретатора Python.Возвращаемым значением является объект модуля (такой же, как аргумент модуля).

1 голос
/ 10 января 2012

Альтернативное решение, которое мне очень помогло, - это сохранение копии ключей 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...