我们正在开发一个AWS LambdaPython 中 Alexa 技能的函数并使用pip
安装ask-sdk
打包到我们的dist/
目录:
pip install -t dist/ ask-sdk
问题在于-t dist/
因为pip
想要在那里拥有所有依赖项,即使它们是在系统范围内安装的。
Now, ask-sdk
依赖于boto3
这会带来很多其他包。但是,那AWS Lambda运行时环境提供boto3
并且不需要将其及其依赖项与我们的代码打包。我有boto3
安装在系统中并且import boto3
有效,所以我想pip
应该感到高兴,但是因为-t dist/
它总是会安装它。
我可以以某种方式安装吗ask-sdk
及其系统中不存在的依赖项,例如ask-sdk-core
,但不是那些已经安装的?
一种方法是列出所有模块并使用pip --no-deps
但这意味着不断手动跟踪依赖关系,我们希望避免这种情况。
无论如何我想告诉pip
:如果该软件包已安装,即使不在-t dist/
不要放入副本dist/
.
那可能吗?
Thanks!
虽然你不能告诉pip“安装除boto3所需的所有依赖项”,但你可以生成所需的requirements.txt
通过计算之间的差异boto3
and ask-sdk
from 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
The 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
依赖项,您可以从 python 依赖项中保存大约 45M 的数据。这ask-sdk
依赖项只有大约 7.5M(压缩后为 2.1M),如果需要,允许您使用内置的 lambda 代码编辑器。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)