在Ubuntu中安装最新的cairo库以供weasyprint使用

9

我刚刚安装了Ubuntu Bionic实例。它预装的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())"

你找到解决办法了吗? - Tito Leiva
1
@TitoLeiva,请检查我的答案并告诉我它是否适用于您。 - Codebling
1个回答

1
"Bionic预装了Cairo 1.15,所以我不确定您是如何获得Cairo 1.14的。Python有时会保留库的内部副本。最简单的第一步检查是"
find /usr/local/lib/python3*/dist-packages/PIL/ -iname '*.so*' | grep cairo

我希望您能找到另一个libcairo,但如果没有的话,以下是如何追踪cairocffi使用的库的方法。
第一步:找到cairocffi正在使用的库
1.0(背景) cairocffi 使用 ctypes.util.find_library尝试定位libcairoctypes.util.find_library使用以下命令进行搜索,以便按顺序查找库。我已将Python代码转换为Shell脚本,并列出了每个命令及其与原始源的链接。
1.1 - 找到备用库
运行这些命令中的每一个,直到找到库为止。这模拟了find_library搜索。
1)find_library 方法 1

ldconfig -p | grep -Eo '\s+(libcairo\.\S+)\s+\(libc6,x86-64'

2) find_library 方法 2

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

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)*'

1.2 验证库的版本

一旦找到该库,检查其版本。

strings /some/weird/place/libcairo.so.2 | grep -E '^P\?' | grep -Eo '[0-9.]+'

如果匹配到了不好的版本,就继续进行。如果没有匹配到,可以尝试使用1.1进行搜索。或者,您也可以尝试对所有Cairo库进行通用搜索:
find /usr -iname '*cairo*.so*'

步骤二:更新库

2.1 确定库的所有者

备用库可能是使用aptpip安装的。我们将检查两者。 1)检查apt

dpkg -S /some/weird/place/libcairo.so.2

2) 检查 pip:

pip list | tail -n +3 | cut -d" " -f1 | xargs pip show -f | grep /some/weird/place/libcairo.so.2

2.2 更新库

如果您可以确定旧版本属于哪个软件包,请升级该软件包。如果不能确定,可以删除它或手动升级它(将新的libcairo.so复制到它上面)。这应该可以解决您的问题。


这只是更新了cairocffi库,但无法将cairo版本从1.14.6升级。 - Tito Leiva
1
@TitoLeiva 不好意思,我已经从头重新写了答案。如果这有帮助到你,请告诉我。 - Codebling
@TitoLeiva,您是否尝试了新答案中提供的解决方案? - Codebling
是的,但这根本不是解决方案。它更像是一种诊断,因为“复制更新的libcairo.so”并不太清楚,从哪里获取libcairo.so开始呢?此外,还有更多相关的软件包与此libcairo相关,所以我不确定是否只需要复制和替换。感谢您的回答,但我仍然使用旧版本。实际上,我已经向创建者发送了一封邮件,但我还没有得到答复。 - Tito Leiva
@TitoLeiva 如果使用apt安装了正确版本的libcairo2,则应该在文件夹/usr/lib中。我鼓励您不要覆盖旧版本,而是确定拥有它的软件包并删除或升级该软件包。上面列出的过程应该指导您完成该过程。 - Codebling

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接