簡體   English   中英

ipython 筆記本的 matplotlib 和 libpng 問題

[英]matplotlib and libpng issues with ipython notebook

我試圖使用 ipython notebook 。 我安裝了所有依賴庫。 但是,在啟動 ipython 或 Ipython 控制台中的“savefig”函數時,我不能使用“--pylab=inline”選項。 當我嘗試執行其中任何一個時,由於執行 matplotlib,返回了一條錯誤消息“RuntimeError:無法創建寫入結構”。 此外,來自 notebookApp 提示的警告說“libpng 警告:使用 libpng-1.2.41 構建但使用 1.5.13 運行的應用程序”。

但是,我安裝了最新的 libpng(1.5.13),使用 pip uninstall 卸載了 matplotlib,並使用 pip 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

非常感謝,

我在 OS X Mavericks 上遇到了同樣的問題,通過自制軟件安裝了 libpng 並安裝了 XQuartz。 結果證明 matplotlib 在編譯時找到了較舊的 XQuartz libpng 版本,但在運行時找到了更新的自制 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

在 Anaconda 環境中工作時,我嘗試在 Jupyter Notebook 中查看來自 OpenCV 的圖像時遇到了同樣的問題。 強制重新安裝 matplotlib 對我有用:

pip install -U --force-reinstall matplotlib

我從 Matt 的解決方案中查看這個 GitHub 鏈接時發現了這種方法。

對我來說

%matplotlib inline

在所有 matplotlib 導入解決此問題之前

我也有這個問題。 另一種解決方案是將筆記本渲染圖像的格式從“png”更改為“svg”。 這可以在您的配置文件中完成。 我的位於:

~/.ipython/profile_default/ipython_notebook_config.py

有一條線看起來像這樣

# c.InlineBackend.figure_format = 'png'

取消注釋並更改為“svg”對我有用:

c.InlineBackend.figure_format = 'svg'

也許它在運行時加載了錯誤的 libpng。 如果您針對 libpng 1.5 構建 matplotlib,請確保您也使用它運行。 libpng 1.2 和 1.5 不兼容。

在 shell 中,您可以設置 DYLD_LIBRARY_PATH 以更改鏈接器首先搜索庫的位置。

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

應該告訴你 matplotlib 在運行時發現了什么。

我有幾乎完全相同的經歷:

  • IPython Notebook 中完全相同的“RuntimeError:無法創建寫入結構”
  • 完全相同的“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,轉而使用自制軟件(這也有一些問題,但我能夠通過直接從源代碼安裝一些包來解決它們,見這個問題) .

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM