python - 如何在 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 绑定。但我也愿意接受任何其他允许我的毒物测试运行的建议。有人对如何解决这个问题有任何想法吗?
解决方案
请求 '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)。
推荐阅读
- r - R - 更多或等于 (≥) - 符号显示/保存为等号 (=)
- php - 新的 Instagram API PHP
- .net - 失败,因为返回的路径不存在
- java - 创建apk文件时发现错误':app:mergeDebugResources'
- c# - 以编程方式将 ics 会议邀请添加到 Google 日历
- html - HTML表单提交按钮在手机中不起作用
- function - Scala Mock:MockFunction0-1() 一次(从未调用 - 不满意)
- javascript - Laravel 集体中的日期选择器
- python - 如何使用 mongodb 在 django 中创建内部连接?
- apache-spark - kafka kafka-consumer-groups.sh --describe 不返回消费者组的输出