Как я могу протестировать пакет с pycairo в качестве зависимости от tox на macOS?

#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 . Но ни один из них не сработал. Есть какие-нибудь идеи относительно того, как я мог бы решить эту проблему?