#python #macos #pip #python-wheel
#python #macos #pip #python-упаковка #python-wheel
Вопрос:
Я создаю свою собственную установку Python, затем использую pip для установки в него некоторых пакетов. Я хочу использовать готовые двоичные колеса для таких пакетов, как криптография.
- Python 2.7.15 / 2.7.16
- Pip 19.0.3
- Setuptools 40.8.0
В GNU / Linux это просто работает: он захватывает колесо manylinux1, и все работает просто отлично.
В macOS он отказывается загружать какие-либо двоичные диски для большинства версий. Я добавил множество -v
опций в pip, но все, что он говорит, это:
$ mypython -s -u -m pip install -v --only-binary 'cryptography' 'cryptography==2.6.1'
...
Skipping link https://files.pythonhosted.org/packages/.../cryptography-2.6.1-cp27-cp27m-macosx_10_6_intel.whl#sha256=... (from https://pypi.org/simple/cryptography/) (requires-python:>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*); it is not compatible with this Python
...
Could not find a version that satisfies the requirement cryptography==2.6.1 (from versions: 1.0.1, 1.0.2, 1.1, 1.1.1, 1.1.2, 1.2, 1.2.1, 1.2.2, 1.3.1, 1.3.2, 1.3.3, 1.3.4, 1.4, 1.5, 1.5.1, 1.5.2, 1.5.3, 1.6, 1.7, 1.7.1, 1.8, 1.8.1, 1.8.2)
Я пытался понять, почему эти конкретные версии в порядке, но не самые последние, и единственное, что я вижу, это то, что эти версии имеют определенный пакет x86_64
wheel, в то время как более поздние имеют только пакеты fat binary intel
wheel. В моем Python есть определение пакета:
>>> import distutils.util
>>> distutils.util.get_platform()
'macosx-10.12-x86_64'
Итак, я подумал, было ли это. Я изменил свою сборку Python для использования MACOSX_DEPLOYMENT_TARGET=10.6
и добавил --enable-universalsdk=/ --with-universal-archs=intel
в строку configure, и теперь мой Python сообщает об этом:
>>> import distutils.util
>>> distutils.util.get_platform()
'macosx-10.6-intel'
Тем не менее, я по-прежнему получаю точно такие же сообщения от pip при попытке установки.
Итак, мне интересно, могу ли я каким-либо образом сделать pip более информативным и точно сказать, что в этих двоичных пакетах ему не нравится, из-за чего он выдает «несовместимо» и пропускает их?
Комментарии:
1. Также включить в Q: вывод
from wheel.pep425tags import get_supported; print(*get_supported())
.2. Обновлено версиями, извините за это. Я получаю
ImportError: No module named wheel.pep425tags
, когда пытаюсь использовать эту команду. Обратите внимание, что я на Python 2.7, если это имеет значение.3. Ага! Я нашел
from setuptools import pep425tags
с помощьюget_supported()
метода.4. Хорошо, с этой информацией я вижу, что я принимаю только
cp27mu
иnone
в качестве второго элемента кортежа, в то время как криптография предоставляет толькоcp27m
. Итак, похоже, что мой Python строится с UCS4 … конечно же, я нахожу--enable-unicode=ucs4
в своих скриптах сборки. Похоже, что он был унаследован от Linux, где это, по-видимому, более распространено. Позвольте мне попробовать без ucs2 вместо этого.5. Это сделало это! Спасибо!
Ответ №1:
Благодаря подсказке от @wim я нашел эту команду:
$ mypython
...
>>> from setuptools.pep425tags import get_supported
>>> for t in get_supported(): print(str(t))
...
Здесь показан полный список кортежей, используемых для сопоставления поддерживаемых пакетов. Используя эту информацию, я смог сравнить ее с загрузками из PyPI и обнаружил, что я создал свой macOS Python с поддержкой UCS4 (которая распространена в Linux), где относительно небольшое количество пакетов PyPI предоставляют широкие двоичные диски в юникоде для macOS.
У меня нет особых причин отдавать предпочтение UCS4, поэтому я переключил свои сборки macOS на UCS2, и это сработало!
Надеюсь, эта информация окажется полезной кому-то еще.
Ответ №2:
Что касается тегов, последние версии pip способны выводить полный список тегов, совместимых с текущим интерпретатором Python, с помощью debug
команды:
$ path/to/pythonX.Y -m pip debug --verbose
WARNING: This command is only meant for debugging. Do not use this with automation for parsing and getting these details, since the output and options of this command may change without notice.
[...]
Compatible tags: 87
cp38-cp38-manylinux2014_x86_64
cp38-cp38-manylinux2010_x86_64
cp38-cp38-manylinux1_x86_64
cp38-cp38-linux_x86_64
cp38-abi3-manylinux2014_x86_64
cp38-abi3-manylinux2010_x86_64
cp38-abi3-manylinux1_x86_64
cp38-abi3-linux_x86_64
cp38-none-manylinux2014_x86_64
cp38-none-manylinux2010_x86_64
cp38-none-manylinux1_x86_64
cp38-none-linux_x86_64
cp37-abi3-manylinux2014_x86_64
cp37-abi3-manylinux2010_x86_64
cp37-abi3-manylinux1_x86_64
cp37-abi3-linux_x86_64
[...]