Перезагрузка модуля с указанием NameError: имя 'reload' не определено

162

Я пытаюсь перезагрузить модуль, который я уже импортировал в Python 3. Я знаю, что вам нужно импортировать только один раз, и importповторное выполнение команды ничего не даст.

Выполнение reload(foo)дает эту ошибку:

Traceback (most recent call last):
    File "(stdin)", line 1, in (module)
    ...
NameError: name 'reload' is not defined

Что означает ошибка?

Лонни Прайс
источник

Ответы:

239

reload является встроенным в Python 2, но не в Python 3, поэтому ожидается ошибка, которую вы видите.

Если вы действительно должны перезагрузить модуль в Python 3, вы должны использовать либо:

Алекс Мартелли
источник
37
Этот ответ звучит так, будто плохо загрузить модуль в Python 3. Что за этим стоит?
ПРО
11
Перезагрузка всегда проблематична. Перезагрузка обновляет переменные модуля, но не удаляет старые, поэтому, если вы переименуете что-то, старое имя все равно будет существовать. Если вы измените определения классов, существующие объекты по-прежнему будут иметь старый тип. Наконец, некоторые модули запускают код во время импорта, который не предназначен для запуска дважды. Так что лучше избегать перезагрузки, но зачастую очень удобно.
Эван
13
Я бы сказал, что это часто проблематично, но не всегда . Конечно, я думаю, что действительные варианты использования для записи reloadв сценарий действительно очень редки, и те, кто использует этот вид темного искусства, вряд ли будут читать этот комментарий. Тем не менее, если вы разрабатываете модуль и используете консоль IPython для интерактивного тестирования, это reloadможет пригодиться в этом рабочем процессе. Как сказал @Evan, следите за побочными эффектами времени импорта. В целом, я бы сказал, чтобы не использовать reloadчужие модули. reloadво время разработки имеет смысл создать свой собственный.
Тим Д
6
Я использую блокнот Jupyter для своей работы, и чтобы сохранить порядок, я помещаю работу, которая требует минимальных изменений в импортируемые пакеты. Тем не менее, эти вещи иногда нуждаются в пересмотре, и перезагрузка абсолютно правильная вещь, так как ядро ​​моего ноутбука хранит вычисления памяти, которые буквально занимали весь день для вычислений.
Скотт
Перезагрузка имеет жизненно важное значение для активной разработки библиотек с длительными вызовами, например, функции базы данных. Однако одна из основных проблем, с которой вы можете столкнуться при перезагрузке модулей, заключается в том, что функции с декораторами будут иметь тенденцию не перезагружаться должным образом, см. Здесь
Александр Макфарлейн,
82

Для> = Python3.4:

import importlib
importlib.reload(module)

Для <= Python3.3:

import imp
imp.reload(module)

Для Python2.x:

Используйте встроенную reload()функцию.

reload(module)
Kevin
источник
48
import imp
imp.reload(script4)

источник
7
Устаревший с Python 3.4 - используйте importlibвместо.
Марк Амери
39

Чтобы расширить ранее написанные ответы, если вы хотите одно решение, которое будет работать в Python версий 2 и 3, вы можете использовать следующее:

try:
    reload  # Python 2.7
except NameError:
    try:
        from importlib import reload  # Python 3.4+
    except ImportError:
        from imp import reload  # Python 3.0 - 3.3
Джои Вильгельм
источник
12

Я рекомендую использовать следующий фрагмент, так как он работает во всех версиях Python (обязательно six):

from six.moves import reload_module
reload_module(module)
Alleo
источник
2

Для совместимости с python2 и python3 вы можете использовать:

# Python 2 and 3
from imp import reload
reload(mymodule)
Патрик Хосе Перейра
источник
1
Это работает в Python 3.7 (и ранее), но ограничено, как писал @Alex Martelli ниже. Используйте ответ Аллео «Из импорта импорта из шести потоков remo_module»
Чарльз Плагер,
2

Если вы не хотите использовать внешние библиотеки, то одним из решений является воссоздание метода перезагрузки из python 2 для python 3, как показано ниже. Используйте это в верхней части модуля (предполагается, что Python 3.4+).

import sys
if(sys.version_info.major>=3):
    def reload(MODULE):        
        import importlib
        importlib.reload(MODULE)

Кстати, перезагрузка очень необходима, если вы используете файлы Python в качестве файлов конфигурации и хотите избежать перезапуска приложения .....

user6830669
источник