"Matplotlib错误:libfreetype.6.dylib"

2024-04-25 12:00:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试运行以下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);

当我这样做时,我会得到以下信息:

^{pr2}$

我尝试重新安装brew,重新安装freetypematplotlib,和{}在brew中,我卸载了MacPorts,错误没有发生任何变化。建议?在

编辑:在卸载MacPorts并重新安装brew之后,我现在得到了这个错误。在

Fatal Python error: PyThreadState_Get: no current thread Command terminated

只有当我importmatplotlib时才会出现错误,所以我猜问题出在matplotlib上。我将尝试用brew重新安装它。在

编辑2:我一直在尝试从这个page开始,但我认为我的错误可能与那一个有关。在


Tags: imageimportnumpy脚本编辑matplotlibas错误
3条回答

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

背景

我使用conda来管理我试图从源代码(GNU Radio)编译的软件项目的虚拟环境。为了在我的Mac电脑上构建这个项目的图形子模块(gr-qtgui),我相信我犯了一些非常令人发指的违反自然的罪行——下面将详细介绍。在

我避免构建问题的基本策略是尽可能依赖单个包管理器。在本例中,这个荣誉授予了conda,尽管其中一些需要brew和{}。在我写这篇文章的时候,我想知道我是否应该链接到Qt4的Mac框架上,但是我最终做的是链接到libQtCore.dylib等。由conda在~/miniconda3/envs/gr/lib安装。*

问题解决方案3>

在让GNU Radio编译完成之后,我在这个虚拟环境中conda install生成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

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

^{pr2}$

换句话说,它链接到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. 另一方面,这真的是我们能做的最好的吗?似乎复杂性是问题的根源。是否有任何足够复杂的工具来管理复杂性,必然会给系统带来更多的复杂性,从而导致更多的失败机会?在

抱歉,这变成了一个沉思而不是一个答案——也许有人会这么好心地建议一个更好的地方来回答这种杂乱无章的问题?在

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

[macosx]在安装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自动文档生成方面造成了问题。第二个是一个更干净的修复,使两者都能工作。在


修复1:conda卸载然后pip安装matplotlib

  • 上下文:我使用anaconda python发行版,并使用conda作为我的主包管理器
  • 扰流板提醒:暂时修复了进口问题,但后来在使用狮身人面像时给我带来了麻烦
  • 要点:在主要库中混合使用pip和conda安装可能会有问题

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

^{pr2}$

这看起来有点毛骨悚然,但如果我没看错,那么这条消息的要点是:斯芬克斯对我混合conda和pip安装不满意。在

所以我最终将matplotlib恢复到conda安装。遗憾的是,最初的libfreetype错误立即返回,我无法执行基本的matplotlib导入(darn…)


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

  • 上下文:我尝试更新freetype、libpng和matplotlib——基本上是任何web建议的内容
  • Spoiler警告:如果运行时路径库没有更新,我将得到关于不兼容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是更干净的方法。在

修好了。。。差不多吧。

修好了。在

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

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

有关任何matplotlibimshow问题,请参阅本页:

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

相关问题 更多 >