Любопытный казус привел к исследованию совместимости процессора Apple M1, и оказалось, что не все так просто...
Впрочем, обо всем по порядку. Мой коллега, владелец MacBook Pro с M1 обратился ко мне с просьбой помочь с установкой библиотеки.
У меня почти такой же MacBook, но на Intel Core i5, macOS Big Sur. При попытке поставить библиотеку
pip install qvd
ERROR: Could not find a version that satisfies the requirement qvd (from versions: none)
ERROR: No matching distribution found for qvd
Обычно такое бывает, когда в составе пакета есть какой-то модуль, несовместимый с текущей ОС. В такой ситуации первое, что я делаю - пытаюсь установить библиотеку в docker container, там у меня очень широкий выбор возможных ОС и настроек.
Dockerfile:
FROM python:3.8-slim-buster
RUN apt-get update && apt-get install -y netcat
COPY . /app
WORKDIR /app
RUN pip install --upgrade pip
RUN pip install -r requirements.txt
CMD ["python", "main.py"]
requirements.txt:
qvd==0.0.10
main.py:
import qvd
if __name__ == '__main__':
print('Hello, qvd')
Далее выполняем команду:
docker build -t testqvd:latest .
И оп-ля, все работает, библиотека встает, образ собирается, контейнер запускается:
docker run testqvd
Hello, qvd
Добавлю (не имеет отношения к данной теме), что библиотека работает по-настоящему, я подключал настоящие файлы и обрабатывал их этой библиотекой.
Отдаю проект коллеге, но у него не собирается!
docker -v
Docker version 20.10.7, build f0df350
У нас обоих версия docker совпадает. В чем может быть причина? Ведь выполнение кода из Dockerfile реально идет в образе python:3.8-slim-buster, он одинаковый у нас. Надо погружаться глубже, разбираться с pip
Для начала посмотрим, почему qvd не ставится на Big Sur:
pip install -vvv qvd
Эта команда выводит очень много текста, но главное, что понятно - none of the wheel's tags (cp37-none-win_amd64) are compatible (run pip debug --verbose to show compatible tags), таких строчек очень много и среди них встречаются только win и manylinux.
Запустим
pip debug --verbose
и получим список подходящих тэгов pip. Никаких win там, конечно, нет, а есть py32-none-macosx_10_13_x86_64 (и похожие). Всех интересующихся, что это значит отсылаю сюда: https://github.com/pypa/manylinux
Тэги совместимости не совпадают, вероятно, по веским причинам - есть библиотеки, которые не смогут запуститься на Big Sur. ОК, понятно, нет вопросов, но есть вопросы, почему при сборке образа на одной и той же ОС из одного и того же источника есть такое существенное отличие.
Добавляю в Dockerfile строчку:
FROM python:3.8-slim-buster
RUN apt-get update && apt-get install -y netcat
COPY . /app
WORKDIR /app
RUN pip install --upgrade pip
RUN pip debug --verbose > /tmp/pip.txt
RUN pip install -r requirements.txt
CMD ["python", "main.py"]
и запускаю сборку вот такой командой:
docker build -t testqvd:latest -o /tmp/buildlogs
В результате получаю файл /tmp/buildlogs/tmp/pip.txt с результатами тэгов pip во время сборки. То же самое делает мой коллега. И они (тэги) получаются разными, у меня, например, - py38-none-manylinux_2_16_x86_64, у коллеги py37-none-manylinux_2_28_aarch64
Вот так, процессор M1 (очевидно) не совпадает с Intel Core и никакими хитрыми docker - технологиями исправить ничего нельзя. Я пока поостерегусь переходить на M1 и другим разработчикам отсоветую.