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

$ 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来运行这个脚本,但我不明白为什么它没有获取动态链接器显然知道的库。我错过了什么?

最佳答案

原来有一个旧的libpixman.so隐藏在my/usr/lib中(这是libcairo的一个依赖项),还有一个新的libpixman隐藏在安装libcairo的文件夹中。因此,当LD_LIBRARY_PATH设置到libcairo的位置时,它将拾取工作的新libpixman,而当未设置时,它将拾取旧libpixman。从/usr/lib中删除旧的libpixman修复了所有问题。

关于python - Python在ldconfig -p确实找到的/usr/lib/x86_64-linux-gnu中找不到库,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37012287/

10-09 00:59
查看更多