Запретить pip от установки некоторых зависимостей

1

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

pip install -t dist/ ask-sdk

Проблема -t dist/ с -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/.

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

Спасибо!

  • 0
    как вы используете лямбда-функцию? Вы проверили без сервера?
  • 0
    @ManojJadhav - Мы используем AWS SAM, но развертывание не является проблемой. Сначала мы должны упаковать его, исключая boto3 и его зависимости.
Теги:
aws-lambda
pip

3 ответа

1

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

0

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

$ 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
    Как я уже упоминал в моем вопросе, касающемся --no-deps нам нужно было бы вручную отслеживать зависимости (кроме boto3, например ask-sdk-core ), которых мы хотели бы избежать.
0

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

  --no-dependencies

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

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

pip install --no-deps -r requirements.txt
  • 0
    Как я уже упоминал в моем вопросе, касающемся --no-deps нам нужно было бы вручную отслеживать зависимости (кроме boto3, например ask-sdk-core ), которых мы хотели бы избежать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню