matplotlib和libpng与ipython笔记本有关

时间:2012-12-11 10:10:09

标签: python matplotlib ipython libpng ipython-notebook

我试图使用ipython笔记本。我安装了所有依赖库。但是,在Ipython控制台中启动ipython或“savefig”功能时,我不能使用“--pylab = inline”选项。当我尝试执行其中任何一个时,由于执行matplotlib而返回错误消息“RuntimeError:无法创建写入结构”。此外,来自notebookApp提示的警告说“libpng警告:应用程序使用libpng-1.2.41构建,但运行时使用1.5.13”。

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

我的系统配置是Mac OS X10.6,python2.7。有人有类似的经历或一些建议吗?

以下是回溯错误:

[<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

非常感谢,

6 个答案:

答案 0 :(得分:7)

我在OS X Mavericks上遇到了同样的问题,通过自制软件安装libpng并安装了XQuartz。事实证明matplotlib在编译时找到了旧的XQuartz libpng版本,但在运行时找到了更新的自制libpng。

我发现的最佳解决方案来自this comment by jaengelberg on github:卸载matplotlib,暂时重命名XQuartz libpng标头,以便找不到它们,安装matplotlib,然后更改标题名称。< / p>

这里是完整的:

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

答案 1 :(得分:3)

我在尝试在Anaconda环境中工作时在Jupyter笔记本中查看来自OpenCV的图像时遇到了同样的问题。强制重新安装matplotlib对我有用:

pip install -U --force-reinstall matplotlib

我在从Matt的解决方案中查看this GitHub link时发现了这种方法。

答案 2 :(得分:3)

对我来说

class CustomSpinnerAdapter extends BaseAdapter {
Context context;

ArrayList<String> tagsNames;
LayoutInflater inflter;

public CustomSpinnerAdapter(Context applicationContext, ArrayList<String> tagsNames) {
    this.context = applicationContext;
    this.tagsNames = tagsNames;
    inflter = (LayoutInflater.from(applicationContext));
}

@Override
public int getCount() {
    return tagsNames.size();
}

@Override
public Object getItem(int i) {
    return null;
}

@Override
public long getItemId(int i) {
    return 0;
}

@Override
public View getView(int i, View view, ViewGroup viewGroup) {
    view = inflter.inflate(R.layout.spinner_layout, null);
    TextView tag_name = (TextView) view.findViewById(R.id.tag_name);
    tag_name.setText(tagsNames.get(i));
    return view;
}

在所有matplotlib导入解决此问题之前

答案 3 :(得分:2)

我也有这个问题。另一种解决方案是更改笔记本将呈现图像的格式,从“png”更改为“svg”。这可以在config file中完成。我的位于:

~/.ipython/profile_default/ipython_notebook_config.py

有一行看起来像这样

# c.InlineBackend.figure_format = 'png'

取消注释并更改为'svg'为我做了诀窍:

c.InlineBackend.figure_format = 'svg'

答案 4 :(得分:1)

也许它在运行时加载了错误的libpng。如果您针对libpng 1.5构建matplotlib,请确保您也使用它运行。 libpng 1.2和1.5不兼容。

在shell中,您可以设置DYLD_LIBRARY_PATH以更改链接器首先搜索库的位置。

otool -L /<somepath>/matplotlib/_png.so

应该告诉你matplotlib在运行时发现了什么。

答案 5 :(得分:0)

我的经历几乎完全相同:

  • 完全相同的“RuntimeError:无法创建写入结构” IPython Notebook
  • 完全相同的“libpng警告:应用程序已构建 使用libpng-1.2.41但运行1.5.13“
  • 相同操作系统:Mac OS X10.6
  • py33-ipython @ 0.13.1_0 + notebook + parallel(来自MacPorts)
  • python3.3(来自MacPorts)代替你的python2.7(只有我看到的差异)

我认为IPython的MacPorts配方可能会对某些操作系统版本产生一些问题。

不知道你从哪里得到你的python2.7,但我的解决方案是我最终放弃了MacPorts而转而支持homebrew(这也有一些问题,但我能够通过直接安装一些软件包解决它们来自消息来源,请参阅this question)。