我无法import matplotlib._png
:
import matplotlib._png as _png ImportError:
/home/james/opt/python/virtualenvs/work/lib/python2.7/site-packages/matplotlib-1.3.x-py2.7-linux-x86_64.egg/matplotlib/_png.so: 未定义的符号:png_set_longjmp_fn
此错误阻止我运行import pylab
(最终导入matplotlib._png
)。
我从源代码安装了matplotlib
,并确保在运行/home/james/local
之前将basedir
中的本地安装路径(setupext.py
)添加到python setup.py install
。
REQUIRED DEPENDENCIES AND EXTENSIONS
numpy: yes [version 1.7.1]
dateutil: yes [using dateutil version 2.1]
tornado: yes [using tornado version 3.0.1]
pyparsing: yes [using pyparsing version 1.5.7]
pycxx: yes [Couldn't import. Using local copy.]
libagg: yes [pkg-config information for 'libagg' could not
be found Using local copy.]
freetype: yes [version 16.0.10]
png: yes [version 1.2.10]
如上所示,matplotlib似乎找到版本1.2.10
,即使我在/home/james/local
下的版本是1.6.2
:
$ find . -iname '*libpng*'
./libpng16.so.16.1.0
./libpng16.so
./libpng16.so.16
./libpng16.a
./libpng.a
./libpng.so
./libpng16.la
./pkgconfig/libpng.pc
./pkgconfig/libpng16.pc
./libpng.la
更具体地说,我修改了setupext.py
中的以下行:
return basedir_map.get(sys.platform, ['/home/james/local', '/usr/local', '/usr'])
但matplotlib似乎找到了系统版本:
$ locate libpng
/usr/lib/libpng.so
/usr/lib/libpng.so.3
/usr/lib/libpng.so.3.10.0
/usr/lib/libpng12.a
/usr/lib/libpng12.so
/usr/lib/libpng12.so.0
/usr/lib/libpng12.so.0.10.0
这可能是问题吗?为什么我无法导入matplotlib._png
?
查看setupext.py
,python setup install
通过pkg-config
方法SetupPackage
查询_check_for_pkg_config
,以确定我已安装的libpng版本。事实证明pkg-config
正在返回系统安装:
$ pkg-config --libs libpng
-lpng12
即使我已在matplotlib的basedir
和setupext.py
中更新了LD_LIBRARY_PATH
,也使其指向我本地安装的libpng
的更新版本。< / p>
有关如何让pkg-config
返回正确版本的任何想法?
答案 0 :(得分:5)
这是一个pkg-config
问题; matplotlib的安装(不幸的,或许不是)过分依赖于pkg-config
的输出。
假设您以正常方式构建libpng,/home/james/local/lib
中应该有一个pkgconfig子目录,其中包含libpng.pc
(和libpng16.pc
)。当setupext.py
运行pkg-config
时,后者当然应该尝试为libpng选择正确的.pc
文件。为此,使用PKG_CONFIG_PATH
变量并将其指向pkgconfig子目录:
$ export PKG_CONFIG_PATH=/home/james/local/lib/pkgconfig
然后,再次安装matplotlib,看到它现在找到了正确的libpng版本:
$ python setup.py build
basedirlist is: ['/usr/local', '/usr']
============================================================================
BUILDING MATPLOTLIB
matplotlib: 1.1.0
python: 2.7.4 (default, Apr 8 2013, 16:36:47) [GCC 4.4.5]
platform: linux2
REQUIRED DEPENDENCIES
numpy: 1.7.0
freetype2: 12.0.6
OPTIONAL BACKEND DEPENDENCIES
libpng: 1.6.1
Tkinter: Tkinter: 81008, Tk: 8.4, Tcl: 8.4
(对我来说,当然使用不同的PKG_CONFIG_PATH。是的,我可能想升级一些依赖项。)
请注意,我甚至没有改变basedirlist
;它只是在默认情况下。
如果pkg-config
现在无法获取其他包,只需在PKG_CONFIG_PATH
中添加更多目录,其中包含冒号。但我想这应该足够了。
答案 1 :(得分:0)
尝试
export LD_LIBRARY_PATH=/home/james/local/lib
然后执行Matplotlib ...将matplotlib指向您的本地版本。