【发布时间】:2013-04-26 01:23:54
【问题描述】:
我无法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,并确保在运行setupext.py 之前将带有本地安装(/home/james/local)的路径添加到basedir 中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通过SetupPackage方法_check_for_pkg_config查询pkg-config来判断我安装的libpng的版本。原来pkg-config正在返回系统安装:
$ pkg-config --libs libpng
-lpng12
即使我在 matplotlib 的 setupext.py 和 LD_LIBRARY_PATH 中更新了 basedir,以使它们指向我在本地安装的更新版本的 libpng。
关于如何让pkg-config 返回正确版本的任何想法?
【问题讨论】:
-
奇怪的是它(大部分)通过了测试,但是当你实际使用它时它就死了。这让我觉得这主要是一个路径问题。
-
谢谢@tcaswell。我认为我越来越接近问题的根源(请参阅顶部的更新)
标签: matplotlib