问题描述
我正在尝试使用 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)。