#python #macos #pip #cairo #tox
Вопрос:
Я пытаюсь использовать tox для тестирования графического пакета, над которым работаю. Одной из его зависимостей является pycairo, поэтому, когда я настраиваю свой tox.ini
файл, я указываю его deps
примерно так:
[testenv]
deps =
pycairo
...(some other packages)
и хотя мои тесты отлично работают в Windows, когда я пытаюсь протестировать пакет на macOS, тест всегда завершается со следующей ошибкой, когда я пытаюсь установить pip-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
Я установил, что основная причина, по которой я получаю эту ошибку, заключается в том, что двоичные файлы wheels и Cairo не предусмотрены для установки pip pycairo на macOS. (Стоит отметить, что я запускаю свои тесты macOS через удаленную виртуальную машину) Таким образом, я попытался сначала установить cairo, используя Homebrew, вот так:
brew install cairo
Однако всякий раз, когда я повторяю тесты, я все равно получаю одно и то же сообщение об ошибке. Я прочитал в другом сообщении SO, что вам также следует установить pkg-config, поэтому в дополнение к установке brew выше я также сделал:
brew install pkg-config
And still ended up with the same error message when I retried the tests. Frustrated, I once again took to Stack Overflow and discovered that you can directly install pycairo (as well as its dependencies, like cairo) with one single brew install command:
brew install py3cairo
Now, whenever I SSH’d into the Mac VM, running the test files worked, but because tox runs tests inside of virtual environments, it can’t access this version of pycairo.
Now, one nasty, probably-horrible-practice, brute-force solution I found was to print out the path of the pycairo directory using this small Python script:
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 мне кажется, что у меня нет способа получить доступ к пакету.
Мне просто нужно, чтобы это работало в токсикологии только в целях тестирования. Я не ожидаю, что кто-либо будет использовать наш пакет в виртуальной среде, поэтому наши пользователи должны просто иметь возможность установить py3cairo через brew непосредственно в свою систему в худшем случае.
Скорее всего, похоже, что мне нужен способ установить cairo и pkg-config таким образом, чтобы pip внутри виртуальной среды мог получить доступ к этим файлам и по-прежнему устанавливать привязки Python. Но я также открыт для любых других предложений, которые просто позволили бы запустить мои тесты на токсины. У кого-нибудь есть какие-нибудь мысли о том, как это исправить?
Ответ №1:
Запрошено «каир >= 1.15.10», но версия каира 1.12.14
Ваша проблема не в обнаруживаемости пакетов, а в устаревшей версии. Если версия cairo, установленная для пивоварения, новее 1.15.10, то у вас может быть отдельная установка cairo, которая будет предпочтительнее вашей версии, установленной для пивоварения.
Чтобы воспроизвести проблему, я сделал следующее:
brew install cairo
python -m venv cairo
source cairo/bin/activate
pip install pycairo
который работал, как и ожидалось (Python 3.9.1, pip 20.2.3).
Комментарии:
1. Как бы вы предложили отменить эту старую установку cairo? Я нигде не мог найти его с
find / -name cairo
помощью , и я попытался добавить несколько разных путей к файлам, связанных с более новой версией , в моюPATH
переменную, напримерexport PATH=/usr/local/Cellar/cairo/1.16.0_5/:$PATH
,export PATH=/usr/local/Cellar/cairo/1.16.0_5/bin/:$PATH
, иexport PATH=/usr/local/lib/cairo/:$PATH
. Но ни один из них не сработал. Есть какие-нибудь идеи относительно того, как я мог бы решить эту проблему?