从matplotlib导入ft2font时出现错误(python,macosx)

8 投票
3 回答
7576 浏览
提问于 2025-04-17 02:46

今天我在安装matplotlib以便使用basemap的时候,发现需要安装很多东西才能让它正常工作。在成功安装了matplotlib并能够导入后,我又安装了basemap,但在导入basemap时遇到了一个错误:

从mpl_toolkits.basemap导入Basemap

追溯(最近的调用最后): 文件 "", 第1行, 在 文件 "/usr/local/Cellar/python/2.7.2/lib/python2.7/site-packages/mpl_toolkits/basemap/init.py", 第36行, 在 从matplotlib.collections导入LineCollection 文件 "/usr/local/Cellar/python/2.7.2/lib/python2.7/site-packages/matplotlib/collections.py", 第22行, 在 导入matplotlib.backend_bases作为backend_bases 文件 "/usr/local/Cellar/python/2.7.2/lib/python2.7/site-packages/matplotlib/backend_bases.py", 第38行, 在 导入matplotlib.widgets作为widgets 文件 "/usr/local/Cellar/python/2.7.2/lib/python2.7/site-packages/matplotlib/widgets.py", 第16行, 在 从lines导入Line2D 文件 "/usr/local/Cellar/python/2.7.2/lib/python2.7/site-packages/matplotlib/lines.py", 第23行, 在 从matplotlib.font_manager导入FontProperties 文件 "/usr/local/Cellar/python/2.7.2/lib/python2.7/site-packages/matplotlib/font_manager.py", 第52行, 在 从matplotlib导入ft2font 导入错误:dlopen(/usr/local/Cellar/python/2.7.2/lib/python2.7/site-packages/matplotlib/ft2font.so, 2): 找不到符号: _FT_Attach_File 引用自: /usr/local/Cellar/python/2.7.2/lib/python2.7/site-packages/matplotlib/ft2font.so 期望在: 动态查找

所以当我尝试在python中导入ft2font时:

从matplotlib导入ft2font

我得到了这个错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: dlopen(/usr/local/Cellar/python/2.7.2/lib/python2.7/site-packages/matplotlib/ft2font.so, 2): Symbol not found: _FT_Attach_File
  Referenced from: /usr/local/Cellar/python/2.7.2/lib/python2.7/site-packages/matplotlib/ft2font.so
  Expected in: dynamic lookup

有没有人知道该怎么解决? 我使用的是Mac OSX 10.6和通过homebrew安装的python 2.7.2。

3 个回答

4

好的,我搞明白了。

我从github上重新安装了matplotlib(网址是https://github.com/matplotlib/),然后我没有用普通的命令python setup.py install,而是按照README.OSX里的说明运行了make.osx:

make -f make.osx PREFIX=/devjunk PYVERSION=2.7 \
  clean fetch deps mpl_install_std

现在一切都正常了。

5

在我的情况下,这是一个架构问题——我安装了64位的freetype(matplotlib可以顺利使用这个),但是当我在32位的Python环境下运行时就出现了错误。解决这个问题的简单方法是先卸载所有东西(包括freetype和matplotlib),然后使用homebrew安装32位和64位的版本,并加上--universal这个选项:

brew install freetype --universal

另外,我还需要对libpng做同样的操作(brew install libpng --universal)。并不是所有的homebrew配方都支持universal选项,但对支持的那些来说,这个选项非常有用。(你可以用brew info <FORMULA>查看某个配方的选项)。

此外,使用make.osx这个Makefile结合homebrew进行编译完全失败;根据我的经验,我建议选择其中一个来使用。

8

我遇到了同样的问题。即使我运行了 make.osx,在从 matplotlib 导入 ft2font 时,它还是报错说 _FT_Attach_File 未定义。我是这样找到问题的。希望这能帮到其他人。

我运行了 otool -L ft2font.so,结果是:

    ft2font.so:
/Users/jbenuck/mpl_build/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.5)
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 52.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)

注意到没有提到 libfreetype!那 ft2font.so 怎么找到这个符号呢,如果它没有链接到这个库的话?

我的下一步是捕捉构建过程中使用的命令:

    make -f make.osx PREFIX=/usr/local clean fetch deps mpl_build > output.txt

搜索后找到了编译这个有问题的 Python 模块时使用的命令。我把输出文件的路径改成了我本地目录的一个文件,然后运行了它:

/Developer/usr/bin/llvm-g++-4.2 -bundle -undefined dynamic_lookup -isysroot / -L/opt/local/lib -arch i386 -arch x86_64 -L/usr/local/lib -syslibroot,/Developer/SDKs/MacOSX10.7.sdk -arch i386 -arch x86_64 -I/usr/local/include -I/usr/local/include/freetype2 -isysroot /Developer/SDKs/MacOSX10.7.sdk build/temp.macosx-10.7-x86_64-2.7/src/ft2font.o build/temp.macosx-10.7-x86_64-2.7/src/mplutils.o build/temp.macosx-10.7-x86_64-2.7/CXX/cxx_extensions.o build/temp.macosx-10.7-x86_64-2.7/CXX/cxxsupport.o build/temp.macosx-10.7-x86_64-2.7/CXX/IndirectPythonInterface.o build/temp.macosx-10.7-x86_64-2.7/CXX/cxxextensions.o -L/usr/local/lib -L/usr/local/lib -L/usr/lib -L/usr/X11/lib -lfreetype -lz -lstdc++ -lm -o ft2font.so

ld: warning: ignoring file /opt/local/lib/libfreetype.dylib, file was built for unsupported file format which is not the architecture being linked (x86_64)

找到了!问题解决了。我知道我安装了 macports 和 homebrew。显然,其中一个在 /opt/local/lib 下的 libfreetype 版本没有编译成 64 位。

我重新运行了命令,去掉了 "-L /opt/local/lib",这次没有警告。把生成的 ft2font.so 复制到我现有的 matplotlib 安装中,现在我可以成功从 matplotlib 导入 ft2font 了。

撰写回答