Вложение изображения в блокнот ipython для распространения
У меня есть ipython-ноутбук со встроенным изображением с моего локального диска. Я ожидал, что он будет встроен в JSON вместе с выходом кодовых ячеек, но когда я распределил ноутбук, изображение не появилось для пользователей. Каков рекомендуемый способ (или способы) встраивания изображения в блокнот, чтобы он не исчезал, если пользователи повторно запускают ячейки кода, очищают вывод ячеек и т.д.?
Система ноутбуков кэширует изображения, включенные в 
, но они сохраняются до тех пор, пока не перезапустится "ядро" python, обслуживающее ноутбук. Если я переименую файл изображения на диск, я могу закрыть и снова открыть ноутбук, и он все еще показывает изображение; но он исчезает, когда я перезапускаю ядро.
Изменить: Если я создаю изображение как вывод кодовой ячейки, а затем экспортирую ноутбук в html, изображение будет встроено в html в виде закодированных данных. Разумеется, должен быть способ подключиться к этой функции и загрузить вывод в ячейку уценки (или, еще лучше, "raw nbconvert" )?
from IPython.display import Image
Image(filename='imagename.png')
будет экспортироваться (с ipython nbconvert
) в html, который содержит следующее:
<div class="output_png output_subarea output_execute_result">
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAnAAAAFgCAYAAAA...
</div>
Однако, даже когда я вручную встроил этот фрагмент в ячейку уценки, я не смог получить изображение для отображения. Что я делаю неправильно?
PS Существующий (старый) ответ дает некоторые очень полезные указатели, но не решение.
Ответы
Ответ 1
Вы счастливы использовать дополнительную ячейку кода для отображения изображения? Если это так, используйте это:
from IPython.display import Image
Image(filename="example.png")
Выходная ячейка будет иметь данные необработанного изображения, встроенные в файл .ipynb
, чтобы вы могли поделиться им, и изображение будет сохранено.
Обратите внимание, что класс Image
также имеет ключевое слово url
, но это будет ссылаться только на изображение, если вы также не укажете embed=True
(см. документация). Поэтому безопаснее использовать ключевое слово filename
, если вы не ссылаетесь на изображение на удаленном сервере.
Я не уверен, есть ли простое решение, если вам нужно, чтобы изображение включалось в ячейку Markdown, то есть без отдельной ячейки кода для генерации данных встроенных изображений. Возможно, вы сможете использовать расширение python markdown, которое позволяет динамически отображать содержимое переменных Python в ячейках памяти. Тем не менее, расширение генерирует ячейки разметки динамически, поэтому для сохранения вывода при совместном использовании ноутбука вам необходимо запустить ipython nbconvert --to notebook original_notebook.ipynb --output preprocessed_notebook
с помощью препроцессора pymdpreprocessor.py
, как указано в разделе "Установка". Сгенерированный блокнот затем имеет данные, встроенные в ячейку уценки, в виде HTML-тега формы <img src="data:image/png;base64,...">
, поэтому вы можете удалить соответствующую ячейку кода из preprocessed_notebook.ipynb
. К сожалению, когда я это пробовал, содержимое тега <img>
на самом деле не отображалось в браузере, поэтому не уверен, что это жизнеспособное решение.: -/
Другой вариант - использовать класс Image
в ячейке кода для создания изображения, как указано выше, а затем использовать nbconvert
с помощью настраиваемого шаблона, чтобы удалить ячейки ввода кода из записной книжки. Подробнее см. этот поток. Однако это приведет к удалению всех кодовых ячеек из конвертированного ноутбука, поэтому может быть не так, как вы хотите.
Ответ 2
Причина, по которой
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAnAAAAFgCAYAAAA...
Тег ничего не делает, когда вы помещаете его в ячейку уценки, потому что IPython использует дезинфицирующее средство для HTML (что-то называемое Google Caja), что экранирует этот тип тега (и многие другие), прежде чем он может быть отображен.
Дезинфицирующее средство HTML в IPython можно полностью отключить, добавив следующую строку в ваш файл custom.js
(обычно расположенный в ~/.ipython/profile_default/static/custom/custom.js
):
iPython.security.sanitize_html = function (html) { return html; };
Это не отличное решение, поскольку оно создает угрозу безопасности, и это не очень помогает в распространении.
Постскриптум:
Возможность визуализации строк в кодировке base64 как изображения!= Очевидная проблема безопасности, поэтому должен быть способ, которым люди Caja могут в конечном итоге разрешить такую вещь (хотя связанный с ним запрос запроса был впервые открыт в 2012 году, поэтому не задерживайте дыхание).