Запретить pip от установки некоторых зависимостей - PullRequest
0 голосов
/ 01 сентября 2018

Мы разрабатываем функцию AWS Lambda для навыка Alexa в Python и используем pip для установки пакета ask-sdk в наш каталог dist/:

pip install -t dist/ ask-sdk

Проблема с -t dist/, потому что pip хочет иметь там все зависимости, даже если они установлены для всей системы.

Теперь у ask-sdk есть зависимость от boto3, которая включает множество других пакетов. Однако среда выполнения AWS Lambda обеспечивает boto3, и нет необходимости упаковывать это и его зависимости с нашим кодом. У меня действительно установлен boto3 в системе и import boto3 работает, поэтому я подумал, что pip должен быть счастлив, но из-за -t dist/ он всегда устанавливает его.

Можно ли как-нибудь установить только ask-sdk и его зависимости, которых нет в системе, например ask-sdk-core, а не те, которые уже установлены?

Один из способов - перечислить все модули и использовать pip --no-deps, но это означает, что нужно постоянно отслеживать зависимости вручную, мы бы хотели этого избежать.

Каким-то образом я хотел бы сказать pip: если пакет уже установлен, даже если его нет в -t dist/, не помещайте копию в dist/.

Это возможно?

Спасибо!

Ответы [ 3 ]

0 голосов
/ 01 сентября 2018

Это будет работать

$ pip install -t dist --no-deps ask-sdk

После вышеупомянутой команды я проверил содержимое каталога dist с помощью дерева, и он установил только ask-sdk без его зависимостей

dist/
├── ask_sdk
│   ├── __init__.py
│   ├── __init__.pyc
│   ├── __version__.py
│   ├── __version__.pyc
│   ├── standard.py
│   └── standard.pyc
└── ask_sdk-0.1.3.dist-info
    ├── INSTALLER
    ├── METADATA
    ├── RECORD
    ├── WHEEL
    └── top_level.txt
0 голосов
/ 29 января 2019

Хотя вы не можете сказать pip «установить все зависимости, кроме тех, которые требуются для boto3», вы можете сгенерировать необходимый requirements.txt, рассчитав разницу между boto3 и ask-sdk из pip freeze вывода (протестировано с Python 3.6.6):

# get boto3 requirements
pip install boto3 -t py_lib.boto3
PYTHONPATH=py_lib.boto3 pip freeze > requirements-boto3.txt

# get ask-sdk requirements
pip install ask-sdk -t py_lib.ask-sdk
PYTHONPATH=py_lib.ask-sdk pip freeze > requirements-ask-sdk.txt

# compute their difference
grep -v -x -f requirements-boto3.txt requirements-ask-sdk.txt > requirements-final.txt

# patch to add one missing dep from boto3
# aws don't have this for some reason
grep urllib3 requirements-boto3.txt >> requirements-final.txt

requirements-final.txt содержит следующее:

ask-sdk==1.5.0
ask-sdk-core==1.5.0
ask-sdk-dynamodb-persistence-adapter==1.5.0
ask-sdk-model==1.6.2
ask-sdk-runtime==1.5.0
certifi==2018.11.29
chardet==3.0.4
idna==2.8
requests==2.21.0
urllib3==1.24.1

Чтобы установить окончательный набор зависимостей в папку:

pip install --no-deps -r requirements-final.txt -t py_lib

Пропустив зависимости boto3, вы можете сохранить около 45M данных из ваших зависимостей python. Зависимости ask-sdk составляют всего около 7,5 МБ (сжатые 2,1 МБ), что позволяет вам использовать встроенный редактор лямбда-кода, если вам нужно.

0 голосов
/ 01 сентября 2018

Вы можете попробовать опцию

  --no-dependencies

Чтобы игнорировать все зависимости.

Чтобы исключить конкретное, вы можете поместить его в файл требований и передать его:

pip install --no-deps -r requirements.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...