前几天我试图深入研究这个问题并提供一些见解。也许有了额外的见解,它最终可以得到解决。
注意事项:
- 安装不同的 Python 版本对我来说不是一个选择(我会立即这样做),因为我需要使用Gurobi线性规划求解器。
- matplotlib 使用 libpng 1.5.14 编译并在运行时链接就好了。在 IPython 控制台中,我可以使用它完美地绘制 png 图形。
- 由于前一点,我认为 IPython Notebook 中使用的后端一定会出现错误,该后端也是用 matplotlib 编译的。
- 我正在尝试使用 matplotlib 1.3 的源代码,如果有人可以让它与以前的版本一起工作,我也会很高兴。
所以,当我尝试在笔记本中绘制一些东西时,我从 matplotlib 得到正常的文本输出,没有放任何数字。在我启动笔记本的终端中,我可以看到以下错误:
libpng warning: Application built with libpng-1.2.41 but running with 1.5.14
由于我之前得出结论,问题一定出在后端,所以我检查了那里链接了哪些库:
otool -L /Library/Python/2.6/site-packages/matplotlib-1.3.0-py2.6-macosx-10.6-universal.egg/matplotlib/backends/_tkagg.so
我系统上的输出是:
/Library/Python/2.6/site-packages/matplotlib-1.3.0-py2.6-macosx-10.6-universal.egg/matplotlib/backends/_tkagg.so:
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.9.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.11)
/System/Library/Frameworks/Tcl.framework/Versions/8.5/Tcl (compatibility version 8.5.0, current version 8.5.7)
/System/Library/Frameworks/Tk.framework/Versions/8.5/Tk (compatibility version 8.5.0, current version 8.5.7)
所以可能有问题的候选者是 Tcl 和 Tk。然后我跑了:
find /System -name libpng\*
事实上我发现:
/System/Library/Tcl/8.4/Img1.4/libpngtcl1.2.24.dylib
/System/Library/Tcl/8.5/Img1.4/libpngtcl1.2.24.dylib
以及 Python 自带的:
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/libpng.3.dylib
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/libpng.dylib
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/libpng12.0.dylib
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/libpng12.dylib
我继续下载了 Tcl/Tk 8.6 的源代码并自己编译它们,希望它们能针对 libpng 进行编译,但事实并非如此。我仍然遇到同样的错误:
libpng warning: Application built with libpng-1.2.41 but running with 1.5.14
当我编译 matplotlib 时,它说由于补丁它提供了自己的 libagg,我找不到它正在使用哪个 tkagg,所以也许这就是问题所在?还是系统提供的 Python 2.6 是用 Tk 编译的,它与旧的 libpng 链接?
我想我可以尝试针对 Tcl/Tk 8.5 的 libpng 版本或 Python 框架中可用的版本编译 matplotlib,然后看看是否两者都在 libpng 版本 1.2.41 上运行。
有谁知道这可能发生在后端的哪个位置以及如何修复编译以使用正确的 libpng 版本?