Как unimport модуль python, который уже импортирован?
Я совершенно новый с NumPy/SciPy. Но в эти дни я начал активно использовать его для численного расчета вместо использования Matlab.
Для некоторых простых вычислений я делаю это только в интерактивном режиме, а не записываю script. В этом случае есть ли способы unimport некоторых модулей, которые уже были импортированы? Unimporting может не понадобиться, когда я пишу программы python, но в интерактивном режиме это необходимо.
Ответы
Ответ 1
Невозможно выгрузить что-то после его импорта. Python хранит копию модуля в кеше, поэтому в следующий раз, когда вы его импортируете, ему не придется перезагружать и повторно инициализировать его снова.
Если вам нужно только потерять доступ к нему, вы можете использовать del
:
import package
del package
Если вы внесли изменения в пакет и хотите увидеть обновления, вы можете reload
его. Обратите внимание, что это не будет работать в некоторых случаях, например, если импортированный пакет также должен перезагрузить пакет, от которого он зависит. Вы должны прочитать соответствующую документацию, прежде чем полагаться на это.
Для версий Python до 2.7, reload
является встроенной функцией:
reload(package)
Для Python версий от 3,0 до 3,3 вы можете использовать imp.reload
:
import imp
imp.reload(package)
Для Python версий 3.4 и выше вы можете использовать importlib.reload
:
import importlib
importlib.reload(package)
Ответ 2
Пока вы не должны беспокоиться о "невозвращении" модуля в Python, обычно вы просто просто уменьшаете ссылку на модуль или функцию import
ed с помощью del
:
>>> import requests
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'readline', 'requests', 'rlcompleter']
>>> del requests
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'readline', 'rlcompleter']
>>>
Обратите внимание, что я бы посоветовал просто не беспокоиться об этом, так как накладные расходы на неиспользуемый импорт почти тривиальны - обход одной дополнительной записи в sys.modules
ничто по сравнению с ложной безопасностью del some_module
не даст вам (подумайте, __init__
выполняет некоторую настройку или вы запустили from X import *
).