Как повторно импортировать определенный файл Python в Jupyter?

IPython Jupyter

Jupyter – очень известная среда разработки в области анализа данных. Использование Jupyter для написания кода, связанного с анализом данных, значительно сократит время разработки.

Представьте такой сценарий: коллеги из других отделов передают вам модуль анализа данных для реализации расширенного анализа данных. В модуле сотни функций.

Если вы напрямую пишете файл Python для вызова модуля анализа данных, использование очень простое:

from analyze import FathersAnalyzer

data = [...]
father = FathersAnalyzer(data)
result = father.analyze()
print(f'分析结果为:{result}')

Теперь вам нужно использовать Jupyter для вызова этого модуля анализа. Как вы должны называть это в Jupyter?

Вы можете подумать, разве это не легко? Непосредственно объедините код этого модуля с кодом Jupyter Notebook..ipynbСоедините файлы вместе, а затем импортируйте их в Jupyter, как обычный модуль, как показано на следующем рисунке:

Итак, теперь возникает проблема, если я изменю его в это времяanalyze.pyфайл, что будет?

Изменим его, как показано на рисунке ниже.

Повторно запустите код в этой ячейке, несмотря на то, что кодfrom analyze import FathersAnalyzer, похоже модуль переимпортирован, но когда я его запускаю, он запускает код до модификации.

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

Так что, если я хочу повторно импортировать импортированный пакет после его изменения? Есть 3 варианта:

  • Перезапустите весь ноутбук. Но это приведет к потере всех переменных в текущей среде выполнения.
  • использоватьimportlib:

Но очевидны и недостатки этой схемы — если вы не будете запускать каждую ячейку последовательно, ваш код станет таким:

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

  • Используйте собственный%autoreload:
%load_ext autoreload
%autoreload 1
%aimport analyze 

data = 123
importlib.reload(analyze)
father = analyze.FathersAnalyzer(data)
result = father.analyze()
print(result)

Эффект операции показан на следующем рисунке:

Код ключа состоит из трех строк:

%load_ext autoreload
%autoreload 1
%aimport analyze 

Эти три строки кода могут нормально работать только в Jupyter, и об ошибке будет сообщено в обычном файле .py. Что они делают: начинается строка 1autoreloadмеханизм. Строка 2, установить автозагрузку через%aimportимпортные модули. Строка 3 использует%aimportимпортanalyzeмодуль.

После того, как это будет записано, запускается любая ячейка, все%aimportИмпортированные модули перезагружаются один раз. Это позволяет вам использовать последний код каждый раз.

Конечно, можно еще больше полениться и сократить специальный код до 2 строк:

%load_ext autoreload
%autoreload 2

%autoreloadКогда для последнего параметра установлено значение 2, при каждом запуске любой ячейки все ячейки будут автоматически перезагружаться.import xxxимпортные модули. Компромисс для этого заключается в том, что он будет работать медленнее.