Проблема при загрузке пакета Python и последующей установке из файлов .whl

Я хочу скачать пакет Python pipy.org и переместить их на другую машину, а затем установить эти пакеты с загруженными файлами .whl на этой машине. Это requirements.txt файл:

amqp==5.1.1
anytree==2.8.0
asgiref==3.5.2
async-timeout==4.0.2
attrs==22.1.0
autobahn==22.7.1
Automat==22.10.0
beautifulsoup4==4.11.1
billiard==3.6.4.0
celery==5.2.7
certifi==2022.9.24
cffi==1.15.1
channels==4.0.0
channels-redis==4.0.0
charset-normalizer==2.1.1
click==8.1.3
click-didyoumean==0.3.0
click-plugins==1.1.1
click-repl==0.2.0
constantly==15.1.0
coreapi==2.3.3
coreschema==0.0.4
cryptography==38.0.3
daphne==4.0.0
Deprecated==1.2.13
Django==4.0.8
django-celery-beat==2.3.0
django-celery-results==2.4.0
django-filter==22.1
django-jalali==6.0.0
django-timezone-field==5.0
djangorestframework==3.14.0
djangorestframework-simplejwt==5.2.2
drf-yasg==1.21.4
et-xmlfile==1.1.0
gunicorn==20.1.0
h2==4.1.0
hpack==4.0.0
hyperframe==6.0.1
hyperlink==21.0.0
idna==3.4
incremental==22.10.0
inflection==0.5.1
itypes==1.2.0
jdatetime==4.1.0
Jinja2==3.1.2
kombu==5.2.4
lxml==4.9.1
MarkupSafe==2.1.1
msgpack==1.0.4
multitasking==0.0.11
numpy==1.23.3
openpyxl==3.0.10
packaging==21.3
pandas==1.5.0
pandas-datareader==0.10.0
Pillow==9.2.0
priority==1.3.0
prompt-toolkit==3.0.31
psutil==5.9.2
psycopg2==2.9.4
pyasn1==0.4.8
pyasn1-modules==0.2.8
pycparser==2.21
PyJWT==2.6.0
pyOpenSSL==22.1.0
pyparsing==3.0.9
python-crontab==2.6.0
python-dateutil==2.8.2
python-dotenv==0.21.0
pytz==2022.4
redis==4.3.4
requests==2.28.1
ruamel.yaml==0.17.21
ruamel.yaml.clib==0.2.7
service-identity==21.1.0
simplejson==3.17.6
six==1.16.0
soupsieve==2.3.2.post1
sqlparse==0.4.3
Twisted==22.10.0
txaio==22.2.1
typing_extensions==4.4.0
tzdata==2022.5
Unidecode==1.3.6
uritemplate==4.1.1
urllib3==1.26.12
vine==5.0.0
wcwidth==0.2.5
wrapt==1.14.1
yfinance==0.1.74
zope.interface==5.5.1

Я загрузил пакеты с:

pip download -r requirements.txt

Это список загруженных пакетов в каталоге ~/LocalPythonPackage:

и после копирования всех файлов `.whl на целевой компьютер, я выполнил этот код:

pip install --no-index --find-links ~/LocalPythonPackage -r requirements.txt

Но я получил эту ошибку:

ERROR: Could not find a version that satisfies the requirement MarkupSafe==2.1.1 (from versions: none)
ERROR: No matching distribution found for MarkupSafe==2.1.1

Я использую python3.11 и Ubuntu 20.04.5 LTS на обоих компьютерах. Я думаю, что эта проблема связана с зависимостями или различиями в OS. Не могли бы вы помочь мне решить эту проблему?

Вы используете Python 3.11, но колеса, которые вы показываете выше, предназначены для Python 3.10. Вам следует загрузить пакеты на хост с той же архитектурой процессора (x64, похоже, это ваш случай), той же ОС и версией (Ubuntu 20) и той же младшей версией Python (Python 3.11.*, то есть любой Python 3.11, но не Python 3.10), что и целевой хост.

Или используйте Python 3.10 на автономном хосте.

TL;DR

Вам необходимо использовать флаги --platform и --only-binary=:all: (иногда необходимо также указать --abi и --python-version) для загрузки колес, совместимых с вашей целевой машиной.

pip3 download --only-binary=:all: --platform manylinux2014_aarch64 -r requirements.txt

(Важно: если ваша целевая машина не имеет архитектуры aarch64, замените manylinux2014_aarch64 на тег правильной платформы)


Некоторые колеса зависят от платформы

Ошибка происходит потому, что pip не может установить предоставленное вами колесо MarkupSafe в каталог, поэтому он говорит, что не может найти правильный дистрибутив.

Поскольку вы упомянули, что оба компьютера одинаковы по версии Python и дистрибутиву ОС, я предположу, что два используемых вами компьютера отличаются по архитектуре. (например, целевой компьютер имеет архитектуру aarch64)

Следующие объяснение и решение основаны на этой догадке.

В Python Packaging User Guide говорится, что Python wheel может быть либо "чисто Python wheel", либо "platform wheel". Когда пакет Python содержит расширения, требующие компиляции, созданное колесо будет специфичным для платформы и не может быть установлено на другие несовместимые платформы.

В вашем случае, колесо MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl является платформенным колесом, созданным для Python 3.10 runtime, manylinux2014 и машин архитектуры x86_64.

Имя файла колеса определено в PEP 491, в формате {distribution}-{version}(-{build tag})?-{python tag}-{abi tag}-{platform tag}.whl.

Последние три компонента имени файла перед расширением называются "тегами совместимости". Теги совместимости выражают основные требования пакета к интерпретатору и подробно описаны в PEP 425.

.

По имени колеса (точнее, по последним трем компонентам в имени файла) можно узнать, является ли оно чисто питоновским или платформенным.

Новые версии Python (за исключением различных мажорных версий) все еще могут устанавливать колеса платформы, созданные для старых минорных версий

В другом ответе в посте говорится, что вам нужно установить колесо, которое имеет ту же версию Python майнера в теге Python, но это обычно не так.

Согласно PEP 425:

Эти теги используются программами установки для принятия решения о том, какой собранный дистрибутив (если таковой имеется) загрузить из списка потенциальных собранных дистрибутивов. Программа установки ведёт список кортежей (pyver, abi, arch), которые она будет поддерживать. Если кортеж собранного дистрибутива есть в списке, то он может быть установлен.

.

Это означает, что pip отвечает за принятие решения о возможности установки дистрибутива на текущую систему.

Давайте посмотрим на исходный код программы pip. Программа CandidateEvaluator оценивает возможных кандидатов на распространение при попытке установить пакет.

Если вы проследите код до конца _py_interpreter_range, то обнаружите, что к поддерживаемым тегам в порядке убывания добавляется список старых минорных версий Python.

Для Python 3.11 теги Python 3.10, Python 3.9, Python 3.8... считаются поддерживаемыми для pip.

Решение

Загрузка pip с опциями --platform, --python-version, --implementation и --abi предоставляет возможность поиска зависимостей для интерпретатора и системы, отличных от той, на которой запущен pip. При использовании любой из этих опций требуется --only-binary=:all: или --no-deps.

из https://pip.pypa.io/en/stable/cli/pip_download/.

Чтобы скачать MarkupSafe для manylinux2014_aarch64:

$ pip3 download --only-binary=:all: --platform manylinux2014_aarch64 MarkupSafe

И измените команду подготовки пакета на:

pip3 download --only-binary=:all: --platform manylinux2014_aarch64 -r requirements.txt
Вернуться на верх