Embedding image in ipython notebook for distribution
我有一个ipython笔记本,带有我本地驱动器的嵌入式图像。我期待它与代码单元的输出一起嵌入JSON中,但是当我分发笔记本时,图像并没有出现在用户身上。在Notebook中嵌入图像的推荐方法是什么,如果用户重新运行代码单元,清除单元格输出等,它不会消失?
笔记本系统缓存![label](image.png)中包含的图像,但它们仅持续到重新启动为笔记本服务的python"内核"。如果我重命名磁盘上的图像文件,我可以关闭并重新打开笔记本,它仍然显示图像;但是当我重新启动内核时它会消失。
编辑:如果我生成一个图像作为代码单元格输出,然后将笔记本导出为html,图像嵌入在html中作为编码数据。当然必须有一种方法来挂钩这个功能并将输出加载到降价(或更好的"原始nbconvert")单元格?
1 2
| from IPython.display import Image
Image(filename='imagename.png') |
将导出(使用ipython nbconvert)到包含以下内容的html:
1
| <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAnAAAAFgCAYAAAA... |
但是,即使我手动将此片段嵌入到markdown单元格中,也无法显示图像。我究竟做错了什么?
PS现有(旧)答案提供了一些非常有用的指针,但不是解决方案。
-
可惜没有人一直回答这个问题! 现在还有解决方案吗?
-
我遇到了完全相同的问题。 显然,在markdown中输入
您是否乐意使用额外的代码单元来显示图像?如果是这样,请使用:
1 2
| from IPython.display import Image
Image(filename="example.png") |
输出单元格将原始图像数据嵌入.ipynb文件中,以便您可以共享它并保留图像。
请注意,Image类还有一个url关键字,但这只会链接到图像,除非您还指定了embed=True(有关详细信息,请参阅文档)。因此,除非您在远程服务器上引用图像,否则使用filename关键字会更安全。
如果您需要将图像包含在Markdown单元格中,即不需要单独的代码单元来生成嵌入的图像数据,我不确定是否有简单的解决方案。您可以使用python markdown扩展,它允许在markdown单元格中动态显示Python变量的内容。但是,扩展会动态生成markdown单元格,因此为了在共享笔记本时保留输出,您需要使用"安装"一节中提到的预处理器pymdpreprocessor.py运行ipython nbconvert --to notebook original_notebook.ipynb --output preprocessed_notebook。然后,生成的笔记本将数据嵌入在markdown单元格中作为格式的HTML标记,以便您可以从preprocessed_notebook.ipynb中删除相应的代码单元格。不幸的是,当我尝试这个时,标签的内容实际上并没有显示在浏览器中,所以不确定这是否是一个可行的解决方案。 : - /
另一种选择是在代码单元格中使用Image类来生成上面的图像,然后使用nbconvert和自定义模板从笔记本中删除代码输入单元格。查看这个线程的详细信息。但是,这将从转换后的笔记本中删除所有代码单元格,因此可能不是您想要的。
-
谢谢!我不要求图像在降价单元格中,但使用代码是(a)分散注意力,因为代码单元格不能被隐藏; (b)更重要的是,它是不安全的,因为这些是用于编程实践的笔记本,并且可以期望用户偶尔清除单元输出。
-
PS。感谢nbconvert线程...我一直在逐渐堆积我自己的转换脚本,因为nbconvert的内核是完全不透明的(并且没有很好地记录)。也许这会引导我找到更好的解释来源。
-
不确定这是否相关,但也许这个例子也有助于更好地理解nbconvert和自动笔记本执行。我没有详细看过它,但在我有限的经验中,nbconvert机器似乎在最新版本的IPython中相对整洁(并且由于笔记本格式本身的简化,可能比以前的版本更简单)。
之所以如此
1
| <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAnAAAAFgCAYAAAA... |
当你把它放在降价单元格中时,tag没有做任何事情,因为IPython使用HTML清理程序(称为Google Caja),它可以在渲染之前筛选出这种类型的标记(以及许多其他标记)。
通过将以下行添加到custom.js文件(通常位于~/.ipython/profile_default/static/custom/custom.js),可以完全禁用IPython中的HTML清理程序:
1
| iPython.security.sanitize_html = function (html) { return html; }; |
这不是一个很好的解决方案,因为它确实会产生安全风险,并且它对分发并没有太大帮助。
后记:
将base64编码的字符串渲染为图像的能力!=显而易见的安全问题,因此Caja人员应该有办法最终允许这种事情通过(虽然相关的功能请求票在2012年首次打开,所以不要'屏住呼吸)。
-
这是一个很好的领先!笔记本具有"可信"笔记本的概念,一旦笔记本被用户检查,就实现(我认为)作为加密密钥。合理的做法是放宽对可信笔记本的html清理。有关如何设置的任何想法?
-
@alexis le叹我也试过了。单击File -> Trust Notebook菜单对话框似乎不会以某种方式影响HTML清理。不过,你是对的。我想它必须在IPython代码库中实现。也许你或我会绕过提交拉取请求?
-
不是我,我不知道如何使这个条件在可信属性(或实际上放在哪里)。而且我不确定彻底禁用消毒是否正确 - 应该有一个更大的功能白名单。如果你对此感兴趣,我会非常好奇地看看开发人员是否接受了这个想法!
-
我很惊讶地发现没有配置选项来为Google Caja指定允许的html标签(Chrome JS控制台的调试输出中的'HTML Sanitizer')。大多数html清理库都有一些白名单标签选项(例如论坛框架,子弹板等)
-
更新:好吧,让我感到惊讶。根据这篇iPython文档,Markdown单元格中的HTML和JavaScript绝对不可信。点击上面@tel所描述的File -> Trust Notebook将只允许HTML和JavaScript输出受信任。不过,我无法相信没有黑客攻击iPython代码就无法做到这一点。在我的情况下,我只想将Desmos.com的一些交互式图形嵌入到一些笔记本中。
-
这引起了很多挫折。在github上有问题要碰到这个吗?有没有人知道的进步?我很欣赏安全方面的问题,但这基本上意味着我回到了powerpoint并且与不使用ipython的人分享我的数据/数据,即我的教授。