Повторный импорт модуля в интерактивном режиме
Как можно повторно импортировать модуль? Я хочу повторно импортировать модуль после внесения изменений в его файл .py.
4 ответ(ов)
Если вы хотите импортировать конкретную функцию или класс из модуля, вы можете сделать это следующим образом:
import importlib
import sys
importlib.reload(sys.modules['my_module'])
from my_module import my_function
Этот код сначала перезагружает указанный модуль с помощью функции importlib.reload()
, что может быть полезно, если вы вносили изменения в модуль и хотите обновить его без необходимости перезапуска вашего скрипта. Затем используется стандартный синтаксис для импорта нужной функции my_function
из модуля my_module
. Убедитесь, что my_module
доступен в вашем пути поиска модулей, иначе импорт не сработает.
На самом деле, в Python 3 модуль imp
помечен как УСТАРЕВШИЙ. Это действительно так для версии 3.4 и выше.
Вместо этого следует использовать функцию reload
из модуля importlib
:
https://docs.python.org/3/library/importlib.html#importlib.reload
Обратите внимание, что в этом библиотеке были изменения API в последних двух минорных версиях.
Если вы используете синтаксис import some_module as sm
, то вам нужно перезагрузить модуль с его псевдонимом (sm
в этом примере):
>>> import some_module as sm
...
>>> import importlib
>>> importlib.reload(some_module) # вызывает "NameError: name 'some_module' is not defined"
>>> importlib.reload(sm) # работает
Обратите внимание, что при использовании псевдонимов для модулей, нужно использовать именно псевдоним для перезагрузки.
Если вы уже находитесь в интерактивном режиме и долго ждали выполнения кода, а вам нужно перезагрузить что-то, что вы импортировали с помощью from mod import func
, и повторное выполнение всех предыдущих ячеек займет много времени, вот решение, которое я нашел:
import importlib
import mod
importlib.reload(mod)
func = mod.func
Это перезапишет ранее загруженную функцию новой версией и не потребует от вас изменять вызовы функции, чтобы включить имя модуля. После этого вам просто нужно будет снова перезагрузить модуль и переопределить функцию каждый раз, когда вы вносите изменения.
Как клонировать список, чтобы он не изменялся неожиданно после присваивания?
Преобразование списка словарей в DataFrame pandas
Ошибка: "'dict' объект не имеет метода 'iteritems'"
Как явно освободить память в Python?
Выбор строки из pandas Series/DataFrame по целочисленному индексу