Matplotlib错误:libfreetype.6.dylib

时间:2015-01-19 16:04:33

标签: python matplotlib dylib freetype

我试图运行以下python脚本(我使用的是Vim):

import numpy as np;
import scipy as sp;
from scipy import misc;
import matplotlib.pyplot as plt;
image = misc.imread('test_image.jpg');
np.fliplr(image);
plt.imshow(image);

当我这样做时,我得到以下内容:

Traceback (most recent call last):
  File "test.py", line 4, in <module>
    import matplotlib.pyplot as plt;
  File "/Library/Python/2.7/site-packages/matplotlib/pyplot.py", line 24, in <module>
    import matplotlib.colorbar
  File "/Library/Python/2.7/site-packages/matplotlib/colorbar.py", line 29, in <module>
    import matplotlib.collections as collections
  File "/Library/Python/2.7/site-packages/matplotlib/collections.py", line 23, in <module>
    import matplotlib.backend_bases as backend_bases
  File "/Library/Python/2.7/site-packages/matplotlib/backend_bases.py", line 50, in <module>
    import matplotlib.textpath as textpath
  File "/Library/Python/2.7/site-packages/matplotlib/textpath.py", line 11, in <module>
    import matplotlib.font_manager as font_manager
  File "/Library/Python/2.7/site-packages/matplotlib/font_manager.py", line 53, in <module>
    from matplotlib import ft2font
ImportError: dlopen(/Library/Python/2.7/site-packages/matplotlib/ft2font.so, 2): Library not loaded: @loader_path/../../../libfreetype.6.dylib
  Referenced from: /Library/Python/2.7/site-packages/matplotlib/ft2font.so
  Reason: image not found
shell returned 1

我尝试重新安装brew,在freetype中重新安装matplotlibnumpybrew,并且我在没有更改错误的情况下卸载了MacPorts。建议?

编辑:卸载MacPorts然后再重新安装brew后,我现在收到此错误。

Fatal Python error: PyThreadState_Get: no current thread Command terminated

错误仅在我import matplotlib时出现,因此我猜测问题出在matplotlib。我将尝试使用brew重新安装它。

EDIT2:我一直试图从这个page无济于事,但我认为我的错误可能与那个有关。

6 个答案:

答案 0 :(得分:7)

[MacOS X]安装graphviz后(为可视化决策树)遇到同样的问题。如果没有仔细隔离环境,这个新包似乎已将自己喜欢的freetype版本放入我的默认python运行时库路径中。然后在进行简单的导入import matplotlib.pyplot as plt时,我收到了错误消息:

ImportError: dlopen(/Users/shandou/anaconda3/lib/python3.6/site-
packages/matplotlib/ft2font.cpython-36m-darwin.so, 2): Library not 
loaded: @rpath/libfreetype.6.dylib
Referenced from: /Users/shandou/anaconda3/lib/python3.6/site- 
packages/matplotlib/ft2font.cpython-36m-darwin.so
Reason: Incompatible library version: ft2font.cpython-36m-darwin.so 
requires version 22.0.0 or later, but libfreetype.6.dylib provides 
version 21.0.0

起初,我无法理解@rpath真正指向的是什么。检查locate libfreetype,看起来我的默认python环境,我有(1)/Users/shandou/anaconda3/lib/libfreetype.6.dylib和(2)/Users/shandou/anaconda3/pkgs/freetype-2.8.1-0

我尝试了以下两个修复程序。第一个解决了使matplotlib导入工作的迫切需要,但后来在sphinx auto doc生成中引起了问题。第二个是更清洁的修复,使两者都有效。

修复1:conda uninstall然后pip install matplotlib

  • 上下文:我使用anaconda python发行版并使用conda作为我的主程序包管理器
  • Spoiler alert:暂时修复了导入问题,但是在使用sphinx时遇到了麻烦
  • 外卖:混合pip和conda安装主要库可能会有问题

按照@Robbie Capps上面的建议,我卸载了最初安装了conda的matplotlib,并用pip重新安装了它。之后matplotlib导入工作正常,我能够继续工作,直到后来我在运行sphinx时出现错误以记录代码:

File "/Users/shandou/anaconda3/lib/python3.6/site-
packages/matplotlib/backends/backend_macosx.py", line 17, in <module>
from matplotlib.backends import _macosx
RuntimeError: Python is not installed as a framework. The Mac OS X 
backend will not be able to function correctly if Python is not 
installed as a framework. See the Python documentation for more 
information on installing Python as a framework on Mac OS X. Please 
either reinstall Python as a framework, or try one of the other 
backends. If you are using (Ana)Conda please install python.app and 
replace the use of 'python' with 'pythonw'. See 'Working with 
Matplotlib on OSX' in the Matplotlib FAQ for more information. 

看起来很毛茸茸,但如果我读得正确的话,信息的要点是:sphinx对我混合conda和pip install不满意。

所以我最终将matplotlib恢复为conda安装。可悲的是,原来的libfreetype错误立即返回,我无法做基本的matplotlib导入(darn ...)

修复2:更新位于运行时路径中的freetype库(错误消息中的@rpath)

  • 上下文:我尝试更新freetype,libpng和matplotlib - 基本上是网络建议的任何内容
  • Spoiler alert:如果没有更新运行时路径库,我将收到有关不兼容的libfreetype的相同错误消息

[步骤1] Brew安装freetype库:

$ brew install freetype
$ brew link --overwrite freetype 

检查/usr/local/Cellar/freetype/2.9/lib/中的库版本时,我得到如下输出:

$ otool -L libfreetype.6.dylib | head -n 2
libfreetype.6.dylib:
/usr/local/opt/freetype/lib/libfreetype.6.dylib (compatibility version 23.0.0, current version 23.0.0)

这是版本21+,所以我们离解决问题更近了一步

[第2步] /usr/local/Cellar/freetype/2.9/lib/libfreetype.6.dylib复制到python运行时库路径

事实证明,即使用conda更新freetype库,运行时库也不会更新。对我有用的最终解决方案是强制将较新的freetype lib复制到运行时路径:

$ cd /Users/shandou/anaconda3/lib/
$ sudo cp /usr/local/Cellar/freetype/2.9/lib/libfreetype.6.dylib .

只有这样,freetype库版本不兼容问题就消失了,matplotlib import和sphinx都很高兴

底线:修复2是更清洁的方式。

答案 1 :(得分:1)

修正了......等等。

修正了它。

我已使用brew uninstall matplotlib卸载,然后随pip install matplotlib一起安装。 pip版本现在可以使用了。 虽然我认为我的代码有问题,因为我没有得到图像输出。

我卸载了python的所有安装,然后安装了ipython,这很正常。另外,我忘了在plt.show();命令之后添加imshow(); ...... :( ....但至少其他人在我之前犯了这个错误......

请参阅此页面以获取有关matplotlib imshow个问题的全面帮助:

matplotlib does not show my drawings although I call pyplot.show()

答案 2 :(得分:0)

听起来你已经(至少部分地)回答了你自己的问题,但我以一种不同的方式解决了同样的错误。 摘要:我使用otoolinstall_name_tool手动将*.so文件中的链接更改为其他*.dylib。我在这里发布它主要是为了说明如果你不小心的话,构建系统如何迅速变成老鼠的巢穴。

背景

我正在使用conda来管理我尝试从源代码编译的软件项目的虚拟环境(GNU Radio)。为了在我的Mac上本地构建这个项目的图形子模块(gr-qtgui),我相信我犯了一些非常令人发指的危害自然的罪行 - 更多内容如下。

避免构建问题的基本策略是尽可能依赖单个包管理器。在这种情况下,荣誉归于conda,但其中一些需要brewpip。在我写这篇文章时,我现在想知道我是否应该与Qt4的Mac框架相关联,但我最终做的是链接libQtCore.dylib 等。由conda在~/miniconda3/envs/gr/lib安装。*

图形问题&amp;分辨率

在编译GNU Radio之后,我在这个虚拟环境中conda install&#39; matplotlib。我最初得到的错误与OP最初提到的相似:

ImportError: dlopen(/Users/strotmc1/miniconda3/envs/gr/lib/python2.7/site-packages/matplotlib/ft2font.so, 2): Library not loaded: @rpath/libfreetype.6.dylib
Referenced from: /Users/strotmc1/miniconda3/envs/gr/lib/python2.7/site-packages/matplotlib/ft2font.so
Reason: Incompatible library version: ft2font.so requires version 21.0.0 or later, but libfreetype.6.dylib provides version 14.0.0

我通过导航到有问题的共享对象的目录并检查它来解决它:

>> cd ~/miniconda3/envs/gr/lib/python2.7/site-packages/matplotlib
>> otool -L ft2font.so
  ft2font.so:
    @rpath/libfreetype.6.dylib (compatibility version 21.0.0, current version 21.0.0)
    @rpath/libc++.1.dylib (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)
>> otool -l ft2font.so
    ...
     Load command 9
      cmd LC_LOAD_DYLIB
  cmdsize 56
     name @rpath/libfreetype.6.dylib (offset 24)
   time stamp 2 Wed Dec 31 19:00:02 1969
      current version 21.0.0
 compatibility version 21.0.0
    ...
    Load command 12
         cmd LC_RPATH
     cmdsize 272
        path /Users/strotmc1/miniconda3/envs/gr/lib (offset 12)
    ...

换句话说,它链接到位于虚拟环境内的libfreetype.dylib,而不是系统上的。排序有意义,因为pyplot也试图访问已经奇怪配置的图形库。我的解决方案是切换到自制类型的freetype链接:

>> install_name_tool -change @rpath/libfreetype.6.dylib /usr/local/Cellar/freetype/2.9/lib/libfreetype.6.dylib ft2font.so 

现在matplotlib有效!

故事的道德

我从一开始就说这个故事很丑陋。写完这篇文章之后,我留下了以下结论:

  1. 尽管能够编制大型软件项目,我仍然不知道自己到底在做什么。
  2. 考虑到编写通用库的难度,以及跨平台可以存在多少变化,并且所有用户都以不同的方式设置他们的系统,我很惊讶任何永远都可以工作。
  3. 另一方面,这真的是我们能做的最好的吗?似乎复杂性是问题的根源。是否有足够复杂的工具来管理复杂性,是否会给系统带来更多的复杂性,从而有更多的失败机会?
  4. 对不起,这变成了一个沉思而不是答案 - 或许有人会如此善意地为这种漫无边际的答案建议一个更好的地方?

    *坦率地说,我从未考虑尝试链接/Library/Frameworks中的Qt 框架。我不确定构建工具(这里是cmake)是否足够聪明才能找到这些框架,因为我还没有尝试过。我会考虑向社区提出这个问题。

答案 3 :(得分:0)

您可以尝试使用Anaconda运行python并检查conda环境中的freetype版本。

当我尝试在conda中安装opencv时遇到了同样的错误。最后,它由一个命令解决:

conda update freetype

答案 4 :(得分:0)

解决问题的两个步骤:

第1步:更新freetype并将.dylib处理到anaconda lib文件夹:

brew upgrade freetype

cp /usr/local/Cellar/freetype/2.10.4/lib/libfreetype.dylib ~/opt/anaconda3/lib/

第2步:按照以下导入顺序进行操作:

 import matplotlib
 matplotlib.use('PS')
 import matplotlib.pyplot as plt
 

答案 5 :(得分:-2)

检查路径触摸你的图像(和双重检查) 这是你的追溯: &#34;原因:找不到图像&#34;

此外,无需使用&#39;;&#39;在python中。