我有一个ipython笔记本,带有我本地驱动器的嵌入式图像 . 我期待它与代码单元的输出一起嵌入JSON中,但是当我分发笔记本时,图像并没有出现在用户身上 . 在Notebook中嵌入图像的推荐方法是什么,如果用户重新运行代码单元,清除单元格输出等,它不会消失?
笔记本系统缓存 ![label](image.png)
中包含的图像,但它们仅持续到重新启动为笔记本提供服务的python "kernel" . 如果我重命名磁盘上的图像文件,我可以关闭并重新打开笔记本,它仍然显示图像;但是当我重新启动内核时它会消失 .
Edit: 如果我生成一个图像作为代码单元格输出,然后将笔记本导出为html,则该图像作为编码数据嵌入到html中 . 当然必须有一种方法来挂钩这个功能并将输出加载到markdown(或更好的"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>
但是,即使我手动将此片段嵌入到markdown单元格中,也无法显示图像 . 我究竟做错了什么?
PS 现有(旧)答案提供了一些非常有用的指针,但不是解决方案 .
2 回答
您是否乐意使用额外的代码单元来显示图像?如果是这样,请使用:
输出单元格将原始图像数据嵌入
.ipynb
文件中,以便您可以共享它并保留图像 .请注意,
Image
类也有一个url
关键字,但这只会链接到图像,除非您还指定embed=True
(有关详细信息,请参阅documentation) . 因此,除非您在远程服务器上引用图像,否则使用filename
关键字会更安全 .如果您需要将图像包含在Markdown单元格中,即不需要单独的代码单元来生成嵌入的图像数据,我不确定是否有简单的解决方案 . 您可以使用python markdown extension,它允许在markdown单元格中动态显示Python变量的内容 . 但是,扩展会动态生成markdown单元格,因此为了在共享笔记本时保留输出,您需要使用预处理器
pymdpreprocessor.py
运行ipython nbconvert --to notebook original_notebook.ipynb --output preprocessed_notebook
,如"Installation"部分所述 . 然后生成的笔记本将数据嵌入在markdown单元格中作为<img src="data:image/png;base64,...">
形式的HTML标记,因此您可以从preprocessed_notebook.ipynb
删除相应的代码单元格 . 不幸的是,当我尝试这个时,<img>
标签的内容实际上并没有显示在浏览器中,所以不确定这是否是一个可行的解决方案 . : - /另一种选择是在代码单元格中使用
Image
类来生成上面的图像,然后使用nbconvert
与自定义模板从笔记本中删除代码输入单元格 . 有关详细信息,请参阅this thread . 但是,这将从转换后的笔记本中删除所有代码单元格,因此可能不是您想要的 .之所以如此
当你把它放在markdown单元格中时,tag没有做任何事情是因为IPython使用HTML清理程序(称为Google Caja)来筛选出这种类型的标记(以及许多其他标记),然后才能渲染它 .
通过将以下行添加到
custom.js
文件(通常位于~/.ipython/profile_default/static/custom/custom.js
),可以完全禁用IPython中的HTML清理程序:这不是一个很好的解决方案,因为它确实会产生安全风险,并且它对分发并没有太大帮助 .
后记:
将base64编码的字符串渲染为图像的能力!=显而易见的安全问题,因此Caja人应该有办法最终允许这种事情通过(尽管the related feature request ticket在2012年首次打开,所以不要屏住呼吸) .