[英]Python not finding library in /usr/lib/x86_64-linux-gnu that ldconfig -p does find
I'm trying to use the python module cairocffi. 我正在尝试使用python模块cairocffi。 I use Debian (Stretch) on x86-64, so I installed the apt package
libcairo2-dev
and installed the cairocffi
python package using pip. 我在x86-64上使用Debian(Stretch),所以我安装了apt软件包
libcairo2-dev
并使用pip安装了cairocffi
python软件包。 This all went well. 一切顺利。 But when I try to import it, it fails to load the module:
但是,当我尝试导入它时,它无法加载模块:
$ 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
However, ldconfig
does know about libcairo.so
: 但是,
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
and when I run python with a modified LD_LIBRARY_PATH
, it works: 当我使用修改后的
LD_LIBRARY_PATH
运行python时,它可以工作:
$ LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu python -c "import cairocffi; print('OK')"
OK
I don't want to have to run python on a modified LD_LIBRARY_PATH
to run this script for the sake of scalability and maintainability, but I can't figure out why it isn't picking up the library that apparently the dynamic linker does know about. 为了可伸缩性和可维护性,我不想在修改后的
LD_LIBRARY_PATH
上运行python来运行此脚本,但是我不知道为什么它没有选择动态链接器确实知道的库。 What am I missing? 我想念什么?
It turns out there was an old libpixman.so hiding in my /usr/lib
(which is a dependency of libcairo), and a newer libpixman in the folder where libcairo was installed. 原来,我的
/usr/lib
有一个旧的libpixman.so(这是libcairo的依赖项),而libcairo的安装文件夹中有一个更新的libpixman。 So when LD_LIBRARY_PATH
was set to the location of libcairo it would pick up the new libpixman which worked, and when it was not set it would pick up the old one. 因此,当
LD_LIBRARY_PATH
设置为libcairo的位置时,它将选择有效的新libpixman,而当未设置它时,它将选择旧的libpixman。 Removing the old libpixman from /usr/lib
fixed everything. 从
/usr/lib
删除旧的libpixman可以修复所有问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.