IPython notebook中的matplotlib和libpng问题

12

我尝试使用 IPython Notebook。我安装了所有必要的库,但在启动 IPython 时无法使用“--pylab = inline”选项或在 IPython 控制台中使用“savefig”函数。当我尝试执行它们之一时,会返回一个错误消息“RuntimeError:Could not create write struct”。这是由于 matplotlib 的执行导致的。此外,notebookApp 提示中的警告显示“libpng warning:Application built with libpng-1.2.41 but running with 1.5.13”。

然而,我安装了最新的 libpng(1.5.13),使用 pip uninstall 卸载了 matplotlib,并使用 pip install 重新安装了 matplotlib(在构建过程中,我可以看到使用 libpng1.5.13 来构建 matplotlib)。

我的系统配置是Mac OS X10.6、Python2.7。是否有人有类似的经验或建议?以下是 traceback 错误:

[<matplotlib.lines.Line2D at 0x106066d50>]
---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/IPython/zmq/pylab/backend_inline.pyc in show(close)
    100     try:
    101         for figure_manager in Gcf.get_all_fig_managers():
--> 102             send_figure(figure_manager.canvas.figure)
    103     finally:
    104         show._to_draw = []

/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/IPython/zmq/pylab/backend_inline.pyc in send_figure(fig)
    209     """
    210     fmt = InlineBackend.instance().figure_format
--> 211     data = print_figure(fig, fmt)
    212     # print_figure will return None if there's nothing to draw:
    213     if data is None:

/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/IPython/core/pylabtools.pyc in print_figure(fig, fmt)
    102     try:
    103         bytes_io = BytesIO()
--> 104         fig.canvas.print_figure(bytes_io, format=fmt, bbox_inches='tight')
    105         data = bytes_io.getvalue()
    106     finally:

/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/backend_bases.pyc in print_figure(self, filename, dpi, facecolor, edgecolor, orientation, format, **kwargs)
   2050                     orientation=orientation,
   2051                     dryrun=True,
-> 2052                     **kwargs)
   2053                 renderer = self.figure._cachedRenderer
   2054                 bbox_inches = self.figure.get_tightbbox(renderer)

/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/backends/backend_agg.pyc in print_png(self, filename_or_obj, *args, **kwargs)
    501             _png.write_png(renderer._renderer.buffer_rgba(),
    502                            renderer.width, renderer.height,
--> 503                            filename_or_obj, self.figure.dpi)
    504         finally:
    505             if close:

RuntimeError: Could not create write struct

非常感谢,

Jie


LD_LIBRARY_PATH设置可能是您的问题。而且,Matplotlib使用的另一个库可能实际上是使用1.2.41构建的。此外,您可以编辑您的帖子并复制粘贴完整的回溯信息吗? - user707650
我使用了 export LD_LIBRARY_PATH="/opt/local/$LD_LIBRARY_PATH" (/opt/local/ 是我放置 libpng15 的位置),但是没有任何改变。 - user1894353
这不应该是 LD_LIBRARY_PATH=/opt/local/lib:$LD_LIBRARY_PATH 吗?但我怀疑你的问题可能还存在其他地方。你能否在 IPython 之外保存 matplotlib 的 png 文件?例如,从一个简单的脚本或默认的 Python 提示符中? - user707650
6个回答

7
我在OS X Mavericks上使用homebrew安装的libpng和XQuartz时遇到了同样的问题。最终发现,matplotlib在编译时找到了旧版本的XQuartz libpng,但在运行时找到了更新的homebrew libpng。
我找到的最好的解决方案来自于jaengelberg在github上的评论:链接。卸载matplotlib,暂时重命名XQuartz libpng头文件以防止其被找到,安装matplotlib,然后将头文件名称更改回来即可。
以下是完整步骤:
pip uninstall matplotlib
cd /opt/X11/include/libpng15
sudo mv png.h _png.h
sudo mv pngconf.h _pngconf.h
sudo mv pnglibconf.h _pnglibconf.h
pip install matplotlib
sudo mv _png.h png.h
sudo mv _pngconf.h pngconf.h
sudo mv _pnglibconf.h pnglibconf.h

4

在Anaconda环境中使用Jupyter Notebook查看OpenCV图像时,我遇到了同样的问题。强制重新安装matplotlib解决了我的问题:

pip install -U --force-reinstall matplotlib

我在查看Matt的解决方案时,发现了这个方法,来源于GitHub链接


4
对于我来说,放置

%matplotlib inline

在所有matplotlib导入之前,解决了这个问题。

不确定为什么这行代码可行,但对我来说也有效!在运行 %matplotlib inline 命令之前,我只导入了 numpycv2matplotlib.pyplot 这三个库。我的 Python 版本是 2.7。 - n1k31t4

2

我也遇到了这个问题。另一个解决方法是将笔记本渲染图像的格式从“png”更改为“svg”。这可以在您的配置文件中完成。我的配置文件位于:

~/.ipython/profile_default/ipython_notebook_config.py

有一行看起来像这样

# c.InlineBackend.figure_format = 'png'

取消注释并将其更改为“svg”对我有用:

c.InlineBackend.figure_format = 'svg'

不错!我给你点赞;这不仅为我解决了问题,而且SVG是从浏览器的本地标记中呈现的,因此它是在基于浏览器的IPython笔记本中呈现图形的更好选择,并且它应该与JavaScript绘图库(例如基于D3的库,如mpld3)更好地配合使用。 - doug

1
也许它在运行时加载了错误的libpng。如果您使用libpng 1.5构建了matplotlib,请确保您也使用它来运行。libpng 1.2和1.5不兼容。
在shell中,您可以设置DYLD_LIBRARY_PATH来更改链接器首先搜索库的位置。
otool -L /<somepath>/matplotlib/_png.so

应该告诉你Matplotlib在运行时找到了什么。


0

我几乎有完全相同的经历:

  • 在IPython Notebook中出现了完全相同的“RuntimeError:Could not create write struct”
  • 完全相同的“libpng warning:Application built with libpng-1.2.41 but running with 1.5.13”
  • 相同的操作系统:Mac OS X10.6
  • py33-ipython @0.13.1_0+notebook+parallel(来自MacPorts)
  • python3.3(来自MacPorts),代替您的python2.7(我从您那里看到的唯一区别)

我认为MacPorts对于某些操作系统版本可能存在一些问题。

不确定您从哪里获取了python2.7,但我的解决方案是最终放弃了MacPorts,转而使用homebrew(它也有一些问题,但我能够通过直接从源安装一些软件包来解决它们,参见this question)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接