首页 > 解决方案 > 如何在 MacOS 上使用 pycairo 作为 tox 的依赖项来测试包?

问题描述

我正在尝试使用 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 安装提供轮子和 Cairo 二进制文件。(值得注意的是,我正在通过远程 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 绑定。但我也愿意接受任何其他允许我的毒物测试运行的建议。有人对如何解决这个问题有任何想法吗?

标签: pythonmacospipcairotox

解决方案


请求 '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)。


推荐阅读