Python没有在/ usr / lib / x86_64-linux-gnu中找到ldconfig -p找到

时间:2016-05-03 18:57:54

标签: python linux debian shared-libraries

我正在尝试使用python模块cairocffi。我在x86-64上使用Debian(Stretch),所以我安装了apt包libcairo2-dev并使用pip安装了cairocffi python包。一切顺利。但是当我尝试导入它时,它无法加载模块:

$ python -c "import cairocffi; print('OK')"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/cairocffi/__init__.py", line 46, in <module>
    cairo = dlopen(ffi, 'cairo', 'cairo-2')
  File "/usr/local/lib/python2.7/dist-packages/cairocffi/__init__.py", line 43, in dlopen
    raise OSError("dlopen() failed to load a library: %s" % ' / '.join(names))
OSError: dlopen() failed to load a library: cairo / cairo-2

但是,ldconfig确实知道libcairo.so

$ sudo ldconfig -p | grep cairo
        libpangocairo-1.0.so.0 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libpangocairo-1.0.so.0
        libpangocairo-1.0.so (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libpangocairo-1.0.so
        libcairo.so.2 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libcairo.so.2
        libcairo.so (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libcairo.so
        libcairo-script-interpreter.so.2 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libcairo-script-interpreter.so.2
        libcairo-script-interpreter.so (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libcairo-script-interpreter.so
        libcairo-gobject.so.2 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libcairo-gobject.so.2
        libcairo-gobject.so (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libcairo-gobject.so

当我使用修改后的LD_LIBRARY_PATH运行python时,它可以工作:

$ LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu python -c "import cairocffi; print('OK')"
OK

我不想为了可扩展性和可维护性而在修改后的LD_LIBRARY_PATH上运行python来运行这个脚本,但我无法弄清楚为什么它没有拿起那个库显然动态链接器确实知道。我错过了什么?

1 个答案:

答案 0 :(得分:0)

事实证明,在我的/usr/lib(这是libcairo的依赖项)中隐藏了一个旧的libpixman.so,并且在安装了libcairo的文件夹中有一个较新的libpixman。因此,当LD_LIBRARY_PATH被设置为libcairo的位置时,它会选择新的libpixman,当它没有设置时,它会选择旧的。从/usr/lib删除旧的libpixman修复了所有内容。