【问题标题】:Unable to import matplotlib._png (pylab)无法导入 matplotlib._png (pylab)
【发布时间】: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)的路径添加到basedirpython 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.pyLD_LIBRARY_PATH 中更新了 basedir,以使它们指向我在本地安装的更新版本的 libpng

关于如何让pkg-config 返回正确版本的任何想法?

【问题讨论】:

  • 奇怪的是它(大部分)通过了测试,但是当你实际使用它时它就死了。这让我觉得这主要是一个路径问题。
  • 谢谢@tcaswell。我认为我越来越接近问题的根源(请参阅顶部的更新)

标签: matplotlib


【解决方案1】:

这是一个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,并在其间添加冒号。但我想这应该足够了。

【讨论】:

  • 谢谢埃弗特。我的/home/james/local/lib 目前不包含任何.pc 文件。我想我应该创造它们。我需要在上面写什么吗?
  • 其实很抱歉,你是对的,有一个名为pkgconfig 的文件夹,里面有两个文件(一个是符号链接)
  • 非常感谢这个解决方案。我尝试了很多方法,这终于奏效了。还应该知道,完成上述步骤后,需要重新安装 matplotlib。至少对我来说,这首先并不清楚。
  • @chromate 是的,python setup.py build 命令暗示了这一点。我会更新我的答案,尝试更清楚地表述。
【解决方案2】:

试试

 export LD_LIBRARY_PATH=/home/james/local/lib

然后执行 Matplotlib... 这会将 matplotlib 指向您的本地版本。

【讨论】:

  • 这并没有解决问题。看起来 matplotlib 依赖于 pkg-config 来确定我已安装的库。
猜你喜欢
  • 2021-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 2017-07-11
  • 2010-11-06
  • 1970-01-01
相关资源
最近更新 更多