2014-09-26 3 views
13

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

Система ноутбуков кэширует изображения, включенные с ![label](image.png), но они сохраняются до тех пор, пока не перезапустится «ядро» питона, обслуживающее ноутбук. Если я переименую файл изображения на диск, я могу закрыть и снова открыть ноутбук, и он все еще показывает изображение; но он исчезает, когда я перезапускаю ядро.

Edit: Если я генерировать изображение в качестве кода ячейки выхода, а затем экспортировать ноутбук 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 Существующий (старый) ответ дает некоторые очень полезные указатели, но не решение.

+0

Жаль, что никто не ответил на этот вопрос за все это время! Возможно, сейчас есть решение? – alexis

+0

Я столкнулся с той же проблемой. По-видимому, причина, по которой вход в диалог « tel

+0

Yeah, that's reasonable, and I had expected some sort of filter. Actually I'd be surprised if originally there was no filter at all-- it's more likely that was just strengthened in version 2. But the question is still, _is_ there some method that gets past the filters? – alexis

ответ

5

Вы хотите использовать дополнительную ячейку кода для отображения изображения? Если да, то используйте это:

from IPython.display import Image 
Image(filename="example.png") 

Выходная ячейка будет иметь исходные данные изображения, внедренные в файл .ipynb, так что вы можете поделиться им, и изображение будет сохранено.

Обратите внимание, что Image класс также имеет url ключевое слово, но это будет только ссылка к изображению, если вы также указать embed=True (см documentation для подробностей). Поэтому безопаснее использовать ключевое слово filename, если вы не ссылаетесь на изображение на удаленном сервере.

Я не уверен, есть ли простое решение, если требуется, чтобы изображение включалось в ячейку Markdown, то есть без отдельной ячейки кода для генерации данных встроенных изображений. Вы можете использовать python markdown extension, который позволяет динамически отображать содержимое переменных 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 с настраиваемым шаблоном, чтобы удалить ячейки ввода кода из ноутбука.См. this thread. Тем не менее, это разделит все ячейки из конвертированного ноутбука, так что это может быть не то, что вы хотите.

+0

Thanks! I don't _require_ the image to be in a markdown cell, but using code is (a) distracting, since the code cell cannot be hidden; and (b) more crucially, it's unsafe because these are notebooks for programming practice and the user can be expectedto clear cell outputs now and then. – alexis

+0

PS. Thanks for the nbconvert thread... I've been gradually piling up my own conversion scripts because nbconvert's guts are completely opaque (and not very well documented). Maybe this will lead me to a source of better explanations. – alexis

+0

Not sure if this is relevant, but maybe [this example](https://github.com/maxalbert/auto-exec-notebook) can also be helpful to better understand 'nbconvert' and automated notebook execution. I haven't looked at it in detail, but in my limited experience the nbconvert machinery seems to be relatively tidy in the latest version of IPython (and potentially simpler than in previous versions due to the simplification of the notebook format itself). – cilix

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; }; 

Это не большое решение, хотя, как оно создает угрозу безопасности , и это не очень помогает в распространении.

Postscript:
Способность оказывать base64 кодированные строки в виде изображений = очевидной проблемой безопасности, так что должен быть способ для людей, Caja в конечном счете позволяют такого рода вещи через (хотя the related feature request ticket был впервые открыт обратно! в 2012 году, так что не задерживайте дыхание).

+1

That's a good lead! Notebooks have a concept of "trusted" notebook, implemented (I think) as a cryptographic key once a notebook has been inspected by the user. The reasonable thing to do would be to relax html sanitizing for trusted notebooks. Any ideas on how this could be set up? – alexis

+1

@alexis *le sigh* I tried that too. Clicking though the 'File -> Trust Notebook', похоже, не влияет на санитацию HTML так или иначе. Вы правы, что должны. Я предполагаю, что он должен быть реализован в кодовой базе IPython. Возможно, вы или я обойдемся, чтобы отправить запрос на тяну? – tel

+0

Не я, я бы понятия не имел, как сделать это условным для доверенного свойства (или, где его разместить, на самом деле). И я не уверен, что полностью отключить санитацию является правильным - должен быть большой белый список функций, которые пропускаются. Если вы достаточно заинтересованы в этом, мне было бы очень интересно узнать, придумают ли разработчики эту идею! – alexis

Смежные вопросы