从matplotlib导入ft2font时出现错误(python,macosx)
今天我在安装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 个回答
好的,我搞明白了。
我从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
现在一切都正常了。
在我的情况下,这是一个架构问题——我安装了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进行编译完全失败;根据我的经验,我建议选择其中一个来使用。
我遇到了同样的问题。即使我运行了 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
了。