在jupyter中对一个PIL.Image
类型的对象img使用img.show()
,报错:
Error: no "view" mailcap rules found for type "image/png"
img.show()
实际上调用的是PIL.ImageShow.show()
。
查看PIL.ImageShow
源码,发现会根据系统类型将对应的图像浏览器注册到全局变量_viewers
中。
当使用Unix系统时,会先注册其他的图像浏览器,最后才注册IPythonViewer,源码如下:
if sys.platform not in ("win32", "darwin"): # unixoids
if shutil.which("xdg-open"):
register(XDGViewer)
if shutil.which("display"):
register(DisplayViewer)
if shutil.which("gm"):
register(GmDisplayViewer)
if shutil.which("eog"):
register(EogViewer)
if shutil.which("xv"):
register(XVViewer)
...
try:
from IPython.display import display as ipython_display
except ImportError:
pass
else:
register(IPythonViewer)
报错信息Error: no "view" mailcap rules found for type "image/png"
正是xdg-open
打开图片时的报错信息。
为了在jupyter中能够正常使用img.show()
,可以删掉系统中的xdg-open
:
sudo apt-get remove xdg-utils
或者更改源码,将register(IPythonViewer)
这一行修改为register(IPythonViewer, 0)
,使IPythonViewer
被优先使用。