Python: OSError: 无法加载库 libcairo.so.2

30

我在Windows 7平台上运行Python脚本时遇到了一些问题。我已经安装了Python和cairo,后者使用"pip"安装的。我使用以下命令来运行脚本:

C:\Python34>python.exe label/make_label.py

我得到以下错误消息:

Traceback (most recent call last):
  File "label/make_label.py", line 6, in <module>
    import cairocffi as cairo
  File "C:\Python34\lib\site-packages\cairocffi\__init__.py", line 41, in <modul
e>
    cairo = dlopen(ffi, *CAIRO_NAMES)
  File "C:\Python34\lib\site-packages\cairocffi\__init__.py", line 34, in dlopen

    return ffi.dlopen(names[0])  # pragma: no cover
  File "C:\Python34\lib\site-packages\cffi\api.py", line 118, in dlopen
    lib, function_cache = _make_ffi_library(self, name, flags)
  File "C:\Python34\lib\site-packages\cffi\api.py", line 411, in _make_ffi_libra
ry
    backendlib = _load_backend_lib(backend, libname, flags)
  File "C:\Python34\lib\site-packages\cffi\api.py", line 400, in _load_backend_l
ib
    return backend.load_library(name, flags)
OSError: cannot load library libcairo.so.2: error 0x7e

我已经完成的工作如下:

  • 将GTK/bin路径添加到环境变量中
  • 检查了GTK/bin文件夹并找到“libcairo-2.dll”,然后将其重命名为“libcairo.so”

我不知道解决这个问题还需要什么其他信息,如果有,请告诉我,我会尝试添加它。


你必须确保Windows(和Python)能够找到libcairo-2.dll。我怀疑Windows/Python是否会自动在GTK/bin中搜索。我也不确定将dll文件重命名为so扩展名是否是一个好主意。 - user707650
我所做的是将libcairo.dll(以及libcairo.so)的位置添加到环境变量的PATH中。我一直认为它会尝试检查该位置。除此之外,我还能用什么方式指向正确的Python路径呢? - Niddro
6个回答

41

在 Mac OS X 上使用 Homebrew:

brew install cairo
brew install pango

9

我刚刚在安装了Anaconda的Mac OSX 10.13上修复了这个问题,解决方法是使用cairosvg

$ conda install cairo pango gdk-pixbuf libffi cairosvg
$ cairosvg image.svg -o image.png

我从https://cairosvg.org/documentation/得到灵感,它指出所有的依赖项都可以通过WeasyPrint进行安装。在https://weasyprint.readthedocs.io/en/latest/install.html#macos上WeasyPrint在MacOSX上的安装文档中指出,需要从HomeBrew获取依赖项:

brew install python3 cairo pango gdk-pixbuf libffi

所以我尝试使用 conda ,结果很顺利。


在 conda 中运行良好。(Win10) - YTZ
你救了我的一天,兄弟!这个答案很棒,而且有效! - Vahid Msm
你救了我的一天,兄弟!这个答案很棒,而且有效! - Vahid Msm
唯一能解决我的M1 Pro问题的答案! - Tristan Bilot

5
似乎cairo依赖一个不在标准搜索库中的共享库,但是Python使用dlopen动态加载库,所以您可以尝试将libcairo.so.2(如果是链接,则确保引用位于同一文件夹中)放在工作目录中。您也可以尝试使用pkg-config设置环境。请参见此处http://people.freedesktop.org/~dbn/pkg-config-guide.html

你说得没错。将libcairo.so文件放在工作目录中,脚本就可以继续运行了。但是,它开始要求更多的lib文件,所以我最终把整个文件夹都放进去了,不必精确地弄清楚需要哪些文件。 - Niddro
如果您按照链接并安装链接中提到的exe文件,并选择所有默认选项,它应该可以工作。 注意:确保关闭并重新打开Python终端或Jupyter笔记本服务器。 - Hissaan Ali

5

我遇到了同样的问题("OSError: cannot load library libcairo.so.2: error 0x7e"),以下是我在Windows上解决这个问题的方法(Windows 7 x64,Python 3.4.2 x86(MSC v.1600 32 bit)):

  • 下载包含第三方依赖项的GTK+堆栈的全套捆绑包(其中包含libcairo-2.dll和其他与Cairo相关的库)(链接)
  • 将此存档文件提取到不含空格的路径中(例如:C:\Programs\gtk+
  • 将提取目录的bin子目录添加到PATH中
    • Win+R,输入SystemPropertiesAdvanced
    • 环境变量...
    • 将此目录添加到Path变量中(分号后面可以是用户变量或系统变量)(例如:...;C:\foo;C:\Programs\gtk+
    • 确定
  • pip install cairosvg
  • 使用已经工作过的非常简单的代码进行测试:
import cairosvg
testsvg = '<svg height="30" width="30">\
    <text y="10">123</text>\
    </svg>'
svgConvertedToPng = cairosvg.svg2png(bytestring=testsvg)
print(svgConvertedToPng)

4
所有合集的链接已失效。 - Anderas

4

在Windows 10上的解决方法如下:

  1. 下载无界面UniConverter安装程序

  2. 找到它所安装的位置,并将其dll子目录添加到系统路径中。

  3. 关闭并重新打开命令窗口以获取更新后的路径。


2

当我在搜索快速解决方案时,发现了适用于MAC OSX的内容。

因此,在使用homebrew安装外部库之后:

brew install cairo #and other necessary stuff

库链接

ln -s /opt/homebrew/lib/libcairo.2.dylib .

需要链接库才能运行Python代码,对我来说它是有效的。

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