Мы разрабатываем функцию 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/
.
Это возможно?
Спасибо!
Хотя вы не можете сказать, пип "установить все зависимости, за исключением тех, которые требуются 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 МБ), что позволяет вам использовать встроенный редактор лямбда-кода, если вам это нужно.
Это будет работать
$ 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
--no-deps
нам нужно было бы вручную отслеживать зависимости (кроме boto3, например ask-sdk-core
), которых мы хотели бы избежать.
Вы можете попробовать вариант
--no-dependencies
Чтобы игнорировать все зависимости.
Чтобы исключить специфику, вы можете поместить его в файл требований и передать его:
pip install --no-deps -r requirements.txt
--no-deps
нам нужно было бы вручную отслеживать зависимости (кроме boto3, например ask-sdk-core
), которых мы хотели бы избежать.