如何在 MacOS 上使用 pycairo 作为依赖项测试软件包?

问题描述

我正在尝试使用 tox 来测试我正在处理的图形包。它的一个依赖项是 pycairo,所以当我设置我的 tox.ini 文件时,我像这样在 deps 下指定它:

[testenv]
deps =
  pycairo
  ...(some other packages)

虽然我的测试在 Windows 上运行良好,但当我尝试在 MacOS 上测试包时,当我尝试 pip-install pycairo 时,测试总是失败并出现以下错误

pip3 install pycairo
Collecting pycairo
  Using cached pycairo-1.20.1.tar.gz (344 kB)
  Installing build dependencies: started
  Installing build dependencies: finished with status 'done'
  Getting requirements to build wheel: started
  Getting requirements to build wheel: finished with status 'done'
    Preparing wheel Metadata: started
    Preparing wheel Metadata: finished with status 'done'
Collecting pygame
  Downloading pygame-2.0.1-cp39-cp39-macosx_10_9_intel.whl (6.9 MB)
Building wheels for collected packages: pycairo
  Building wheel for pycairo (PEP 517): started
  Building wheel for pycairo (PEP 517): finished with status 'error'
  ERROR: Command errored out with exit status 1:
   command: /Users/appveyor/projects/cpython-cmu-graphics-0l7rb/.tox/py39/bin/python /Users/appveyor/projects/cpython-cmu-graphics-0l7rb/.tox/py39/lib/python3.9/site-packages/pip/_vendor/pep517/_in_process.py build_wheel /var/folders/5s/g225f6nd6jl4g8tshbh1ltk40000gn/T/tmpnqn0c3o6
       cwd: /private/var/folders/5s/g225f6nd6jl4g8tshbh1ltk40000gn/T/pip-install-1vu11s7g/pycairo_6159cae3f6b14ec3a8681d1238fa6919
  Complete output (12 lines):
  running bdist_wheel
  running build
  running build_py
  creating build
  creating build/lib.macosx-10.15-x86_64-3.9
  creating build/lib.macosx-10.15-x86_64-3.9/cairo
  copying cairo/__init__.py -> build/lib.macosx-10.15-x86_64-3.9/cairo
  copying cairo/__init__.pyi -> build/lib.macosx-10.15-x86_64-3.9/cairo
  copying cairo/py.typed -> build/lib.macosx-10.15-x86_64-3.9/cairo
  running build_ext
  Requested 'cairo >= 1.15.10' but version of cairo is 1.12.14
  Command '['pkg-config','--print-errors','--exists','cairo >= 1.15.10']' returned non-zero exit status 1.
  ----------------------------------------
  ERROR: Failed building wheel for pycairo
Failed to build pycairo
ERROR: Could not build wheels for pycairo which use PEP 517 and cannot be installed directly

我确定我收到此错误的主要原因是没有为 MacOS 上的 pycairo pip 安装提供轮子和开罗二进制文件。 (值得注意的是,我正在通过远程 VM 运行我的 MacOS 测试)因此,我尝试首先使用 Homebrew 安装 cairo,如下所示:

brew install cairo

但是,每当我重试测试时,我仍然收到相同的错误消息。我在另一篇 SO 文章中读到,你也应该 brew install pkg-config,所以除了上面的 brew 安装之外,我还做了:

brew install pkg-config

当我重试测试时仍然得到相同的错误消息。沮丧的是,我再次使用 Stack Overflow 并发现您可以使用一个 brew install 命令直接安装 pycairo(以及它的依赖项,如 cairo):

brew install py3cairo

现在,每当我通过 SSH 连接到 Mac 虚拟机时,运行测试文件都有效,但由于 tox 在虚拟环境中运行测试,因此无法访问此版本的 pycairo。

现在,我发现的一个讨厌的,可能是可怕的做法,蛮力解决方案是使用这个小的 Python 脚本打印出 pycairo 目录的路径:

import os
import cairo
print(os.path.dirname(cairo.__file__))

然后我将该目录cp放入虚拟环境中,发现它实际上允许您运行 import cairo 而不会出错。

cp -r <path>/cairo venv3.9/lib/python3.9/site-packages
Python 3.9.1 (default,Dec 26 2020,00:12:24)
[Clang 12.0.0 (clang-1200.0.32.28)] on darwin
Type "help","copyright","credits" or "license" for more information.
>>> import cairo
>>>

然而,毫不奇怪,这似乎不适用于我正在测试的任何其他 Python 次要版本,如果这以我尚未发现的其他方式破坏了库,我也不会感到惊讶。所以这也不是一个真正可以接受的解决方案。

我该怎么做才能使我的测试正常运行?在我的测试中,我只想模拟一个已经安装了所有包依赖项的环境,但是使用 pycairo 似乎没有办法让我访问包。

我只需要它在 tox 中工作仅用于测试目的。我预计不会有人在虚拟环境中使用我们的软件包,因此在最坏的情况下,我们的用户应该能够通过 brew 将 py3cairo 直接安装到他们的系统中。

最有可能的是,看起来我需要一种安装 cairo 和 pkg-config方法,以便虚拟环境中的 pip 可以访问这些文件并仍然安装 Python 绑定。但我也愿意接受任何其他只会让我的毒性测试运行的建议。有没有人对如何解决这个问题有任何想法?

解决方法

请求 'cairo >= 1.15.10' 但 cairo 的版本是 1.12.14

您的问题不在于包的可发现性,而在于版本过时。如果 brew 安装的 cairo 版本比 1.15.10 新,那么您可能有一个单独的 cairo 安装,它比安装 brew 的版本更受欢迎。

为了重现该问题,我执行了以下操作:

brew install cairo
python -m venv cairo
source cairo/bin/activate
pip install pycairo

按预期工作(Python 3.9.1,pip 20.2.3)。