Проблема при загрузке пакета 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