2025, Nov 26 12:04
Как исправить в Jupyter ошибку «IPython is not defined» и вернуть ipywidgets и интерактивный Matplotlib
Что делать, когда Jupyter пишет «IPython is not defined»: включаем widgets и ipympl, активируем nbextensions и используем %matplotlib widget для интерактива.
Jupyter Notebook открывается, ячейки выполняются, но любой интерактивный вывод падает — появляется розовая плашка с единственной фразой: Javascript Error: IPython is not defined. Если вы используете ipywidgets или интерактивные бэкенды Matplotlib, это сообщение моментально блокирует работу. Ниже — краткое объяснение, что вызывает проблему в такой конфигурации и как вернуть виджеты и «живые» графики.
Как воспроизвести проблему
Сбой проявляется сразу при использовании интерактивных бэкендов. Например, запуск следующей минимальной ячейки в новом блокноте приводит к той самой плашке:
%matplotlib nbagg
import matplotlib.pyplot as graph
canvas, area = graph.subplots()
Окружение — свежая база Miniconda, Jupyter Notebook и пакеты вроде ipython, matplotlib и ipympl, установленные в стандартное базовое окружение. Ядро — Python 3 (ipykernel).
Что на самом деле происходит
Главный симптом: фронтенд в браузере не находит IPython на стороне JavaScript. В итоге не подгружаются фронтенд-ассеты, отвечающие за виджеты и интерактивный Matplotlib, и интерфейс блокнота сообщает, что объект IPython недоступен. На практике это случается, когда нужные nbextensions не включены в том окружении, из которого вы запускали Jupyter, либо команды подключения выполнялись вне активного окружения. Характерный признак — сообщение вроде jupyter-nbextension not found, пока не активируете верное окружение.
Есть и практическая тонкость, замеченная с Jupyter Notebook 7. Установка изнутри блокнота через «магическую» команду помогала лишь при переходе на современный интерактивный бэкенд. Конкретно, использование %pip install ipython позволило выводить графики при %matplotlib widget, тогда как устаревший nbagg продолжал падать.
Как восстановить интерактивный вывод
Начните с проверки, что вы работаете именно в том окружении, куда ставили пакеты. Явно активируйте нужное окружение и включите необходимые расширения. Затем перезапустите систему и полностью перезагрузите всё перед повторным запуском блокнота.
conda activate base
jupyter nbextension enable --py widgetsnbextension
jupyter nbextension enable --py ipympl
После этого перезагрузите компьютер. Затем снова запустите интерфейс блокнота из того же окружения.
jupyter notebook
Внутри блокнота через меню перезапустите ядро, очистите весь вывод и заново выполните все ячейки. Если браузер «держит» устаревшие ресурсы, сделайте жёсткое обновление страницы. В Windows — Ctrl+Shift+R или Ctrl+F5, в Chrome на macOS — Command+Shift+R.
Проверочный пример с обновлённым кодом
Если вам подходит современный интерактивный вариант, который работал в Notebook 7 в ходе отладки, используйте виджет-бэкенд. Суть та же — отличаются только имена по сравнению с предыдущим фрагментом.
%matplotlib widget
import matplotlib.pyplot as painter
frame, region = painter.subplots()
На этом этапе ipywidgets и интерактивный Matplotlib должны отображаться. Если вам принципиально нужен nbagg, включение расширений, как показано выше, закрывает разрыв во фронтенде, из‑за которого возникла исходная ошибка.
Почему это важно
Интерактивность в Jupyter держится на корректной регистрации Python‑ и JavaScript‑компонентов в одном и том же окружении, из которого запускается сервер блокнота. Если звено цепочки не активно, браузерный интерфейс не может загрузить ожидаемые объекты и показывает общее сообщение об ошибке. Включение расширений именно в рабочем окружении устраняет скрытое несоответствие и возвращает ожидаемую интерактивность.
Практические замечания по установкам из блокнота
Устанавливая пакеты прямо из Jupyter, отдавайте предпочтение встроенной «магии». В нашем случае %pip install в Notebook 7 помог запустить интерактивные графики с %matplotlib widget. При разборе проблем всегда приводите полный текст ошибки: даже лаконичные плашки порой отличаются и подсказывают, где именно произошёл сбой.
Итоги
Если в блокноте всплывает Javascript Error: IPython is not defined, убедитесь, что Jupyter запущен из нужного окружения, включите в нём расширения widgets и ipympl, всё перезапустите и выполните все ячейки заново. Работаете в Notebook 7 и хотите совместимый с современной связкой интерактивный бэкенд — переходите на %matplotlib widget. Эти шаги синхронизируют Python‑ и JavaScript‑части стека и возвращают привычную интерактивность.