我正在编写一个用于交互数据可视化的小型python程序包。我们希望在程序包中包含gif,以便用户可以运行示例并学习如何与图形交互。
这是一个示例结构:
<package>
+-->some_module/
+--> static/
+--> foo.gif
+--> spam.py
+-->examples/
+--> example.ipynb
我们有几个类(例如spam.py
可能包含垃圾邮件类),这些类将具有方法.show_gif()
,该方法将在静态方法中显示gif(foo.gif
)并显示它给用户。
该代码被编写为在Jupyter笔记本中使用。在程序包中,我们提供了一些示例(例如example.ipynb
),这些示例将导入spam
,然后在相关类上调用.show_gif()
方法。
当前,我们使用以下方式显示gif:
from IPython.core.display import Image
Image(filename=path_to_gif)
当gif位于jupyter笔记本所在文件夹的子目录中时,它工作正常,但是当gif在包的同级目录中时则无效(如上例所示)。
编辑:
我相信我可以访问.gif,但无法在jupyter笔记本中显示它(请参见下文)
也有类似的堆栈溢出问题(This question),建议使用标准库中的importlib.resources module
。但是,它们返回一个我不知道如何处理的BinaryIO实例,见:
import some_module.static as static
…
def show_gif(self):
image = pkg_resources.open_binary(static, 'foo.gif')
return Image(data=image)
这会引发错误,因为我给Image设置了错误的数据类型。如何打开此.gif并将其显示在jupyter笔记本中?
答案 0 :(得分:1)
使用任何方法找到gif文件的路径并打开以进行读取; pkg_resources.open_binary()
可以,尽管这是磁盘上的实际文件,所以有一些更简单的方法。但是现在您有了一个打开的文件句柄,而不是内容本身-与在文件上调用open()
时一样。要获取图像数据,您需要从文件句柄中read()
。
您将拥有一个bytes
对象,而不是文本字符串。这不是问题,因为Image()
在构造函数中接受bytes
:
with pkg_resources.open_binary(some_module, 'foo.gif') as src:
imagedata = src.read()
image = Image(data=imagedata)