Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.0k views
in Technique[技术] by (71.8m points)

macos - Import error ft2font from matplotlib (python, macosx)

I was installing matplotlib to use basemap today when I had to install a lot of stuff to make it work. After installing matplotlib and be able to import it I installed basemap but I can't import basemap because of this error:

from mpl_toolkits.basemap import Basemap

Traceback (most recent call last): File "", line 1, in File "/usr/local/Cellar/python/2.7.2/lib/python2.7/site-packages/mpl_toolkits/basemap/init.py", line 36, in from matplotlib.collections import LineCollection File "/usr/local/Cellar/python/2.7.2/lib/python2.7/site-packages/matplotlib/collections.py", line 22, in import matplotlib.backend_bases as backend_bases File "/usr/local/Cellar/python/2.7.2/lib/python2.7/site-packages/matplotlib/backend_bases.py", line 38, in import matplotlib.widgets as widgets File "/usr/local/Cellar/python/2.7.2/lib/python2.7/site-packages/matplotlib/widgets.py", line 16, in from lines import Line2D File "/usr/local/Cellar/python/2.7.2/lib/python2.7/site-packages/matplotlib/lines.py", line 23, in from matplotlib.font_manager import FontProperties File "/usr/local/Cellar/python/2.7.2/lib/python2.7/site-packages/matplotlib/font_manager.py", line 52, in from matplotlib import ft2font 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

So when I tried to import ft2font in python by:

from matplotlib import ft2font

I got this error:

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

Any idea what to do? I'm using Mac OSX 10.6 and python 2.7.2 installed by homebrew.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

I ran into the same issue. Even after running make.osx, it still complained about _FT_Attach_File being undefined when I imported ft2font from matplotlib. Here's how I tracked down the problem. Hopefully, it will help someone else.

Running otool -L ft2font.so yielded:

    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)

Note the absence of any mention of libfreetype! How is ft2font.so supposed to locate the symbol if it isn't linked against it?

My next step was to capture the commands used during the build:

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

Searching this yielded the command that was used to compile the offending python module. I changed the value of the output file to be one in my local directory and ran it:

/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)

Bingo! Problem found. I know I have both macports and homebrew installed. Apparently, one of them has a version of libfreetype in /opt/local/lib that isn't compiled for 64-bit.

I reran the command with "-L /opt/local/lib" removed which worked without a warning. Copying the resulting ft2font.so into my existing matplotlib installation now allows me to successfully import ft2font from matplotlib.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...