在Ubuntu中安装最新的cairo lib for weasyprint

Jos*_*ano 9 python ubuntu cairo python-3.x weasyprint

我刚刚安装了一个Ubuntu仿生实例。它预装了cairo 1.14.6。我至少需要cairo 1.15.4才能使weasyprint正常工作。不幸的是,即使在安装了最新的cairo之后,python仍然会选择旧的库。任何线索,我将不胜感激。

# Install weasyprint dependencies
sudo apt-get install build-essential python3-dev python3-pip python3-setuptools python3-wheel python3-cffi libcairo2 libpango-1.0-0 libpangocairo-1.0-0 libgdk-pixbuf2.0-0 libffi-dev shared-mime-info

# Check cairo lib version, prints "1.15.10-2ubuntu0.1"
dpkg -l '*cairo*'

# Install weasyprint
pip3 install weasyprint

# Test cairo version catch by python, still prints "1.14.6"
python3 -c "import cairocffi; print(cairocffi.cairo_version_string())"
Run Code Online (Sandbox Code Playgroud)

Cod*_*ing 1

Bionic 附带 Cairo 1.15,所以我不确定你是如何获得 Cairo 1.14 的。

Python 有时会保留库的内部副本。最简单的第一个检查是

find /usr/local/lib/python3*/dist-packages/PIL/ -iname '*.so*' | grep cairo
Run Code Online (Sandbox Code Playgroud)

我希望您能在那里找到另一个libcairo,但如果没有,您可以通过以下方法找到图书馆cairocffi正在找到的内容。

cairocffi第1步:找到正在使用的库

1.0(背景)

cairocffi 用于 ctypes.util.find_library尝试定位libcairo. ctypes.util.find_library 使用这些命令进行搜索,以便尝试找到库。我已将 python 代码转换为 shell 脚本,并列出了每个代码并附有原始源代码的链接。

1.1 - 查找备用库

运行这些命令中的每一个,直到找到该库。这模拟了find_library搜索。

1)find_library 方法1

ldconfig -p | grep -Eo '\s+(libcairo\.\S+)\s+\(libc6,x86-64'
Run Code Online (Sandbox Code Playgroud)

2)find_library 方法2

gcc -Wl,-t -o /tmp/bla -lcairo 2> /dev/null | grep -E '([^\(\)]|\S)*libcairo\.([^\(\)]|\S)*'
Run Code Online (Sandbox Code Playgroud)

3)find_library 方法3

libs=$(for d in `echo $LD_LIBRARY_PATH | sed 's/:/ /g'`; do printf -- "-L$d "; done); ld -t $libs -o /dev/null -lcairo 2> /dev/null | grep -Eo '([^\(\)]|\S)*libcairo\.([^\(\)]|\S)*'
Run Code Online (Sandbox Code Playgroud)

1.2 验证库版本

找到该库后,检查其版本。

strings /some/weird/place/libcairo.so.2 | grep -E '^P\?' | grep -Eo '[0-9.]+'
Run Code Online (Sandbox Code Playgroud)

如果它与错误版本匹配,请继续。如果没有,请继续使用 1.1 进行搜索。或者,您也可以尝试对所有开罗库进行通用搜索:

find /usr -iname '*cairo*.so*'
Run Code Online (Sandbox Code Playgroud)

第 2 步:更新库

2.1 确定谁拥有该库

备用库可能已使用apt或安装pip。我们会检查两者。1)检查apt

dpkg -S /some/weird/place/libcairo.so.2
Run Code Online (Sandbox Code Playgroud)

2)检查pip

pip list | tail -n +3 | cut -d" " -f1 | xargs pip show -f | grep /some/weird/place/libcairo.so.2
Run Code Online (Sandbox Code Playgroud)

2.2 更新库

如果您可以确定哪个软件包拥有旧版本,请升级该软件包。如果没有,请删除它或手动升级它(复制较新的版本libcairo.so覆盖它)。这应该可以解决你的问题。