Перезагрузить компонент из модуля в Python3
Этот вопрос похож на [ Python: перезагрузить компонент Y, импортированный с 'из X import Y'? ]. Однако явно перезагрузка не работает в Python3.
У меня изначально было
from vb2GP import vb_Estep
Однако из-за ошибки я изменил vb_Estep. Когда я пытаюсь перезагрузить с помощью importlib.reload(vb_Estep)
Я получаю ошибку:
File "<ipython-input-61-72416bca3a93>", line 1, in <module>
importlib.reload(vb_Estep)
File "/Users/sachin/anaconda/lib/python3.5/importlib/__init__.py", line 139, in reload
raise TypeError("reload() argument must be module")
TypeError: reload() argument must be module
Я даже пытался importlib(vb2GP.vb_Estep)
где я получаю ошибку NameError: name 'vb2GP' is not defined
, что имеет смысл, так как я никогда не импортировал vb2GP для начала.
Итак, вопрос в том, как перезагрузить компоненты в Python3, используя importlib
,
1 ответ
reload
Используемая вами функция работает только с модулями, а не с объектами, импортированными из них. Чтобы использовать его, вам нужно будет импортировать vb2GP
сначала позвони reload
на объекте модуля, затем извлеките перезагруженный vb_Estep
значение из новой версии модуля.
import importlib
import vb2GP # import the old version of the module
vb2GP = importlib.reload(vb2GP) # reload it
vb_Estep = vb2GP.vb_Estep # get a reference to the value in the reloaded module
Но это может и не быть необходимым, в зависимости от того, как именно вы "изменили" текущий vb_Estep
значение. Если у вас есть только отскок имени к новому значению, вы можете просто повторно импортировать старое, не делая никаких reload
вообще (просто используйте from vb2GP import vb_Estep
снова). Только если вы изменили значение на месте (например, изменив его содержимое или атрибуты без повторного связывания самого имени переменной), reload
код выше будет необходимо.