Подтвердить что ты не робот

Вложение изображения в блокнот ipython для распространения

У меня есть ipython-ноутбук со встроенным изображением с моего локального диска. Я ожидал, что он будет встроен в JSON вместе с выходом кодовых ячеек, но когда я распределил ноутбук, изображение не появилось для пользователей. Каков рекомендуемый способ (или способы) встраивания изображения в блокнот, чтобы он не исчезал, если пользователи повторно запускают ячейки кода, очищают вывод ячеек и т.д.?

Система ноутбуков кэширует изображения, включенные в ![label](image.png), но они сохраняются до тех пор, пока не перезапустится "ядро" 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 Существующий (старый) ответ дает некоторые очень полезные указатели, но не решение.

4b9b3361

Ответ 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 году, поэтому не задерживайте дыхание).