【问题标题】:Prevent pip from installing some dependencies防止 pip 安装某些依赖项
【发布时间】:2019-02-07 02:46:39
【问题描述】:

我们正在为 Python 中的 Alexa 技能开发一个 AWS Lambda 函数,并使用 pipask-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/ 中复制。

这可能吗?

谢谢!

【问题讨论】:

  • 如何部署 lambda 函数?你检查过无服务器吗?
  • @ManojJadhav - 我们使用 AWS SAM,但部署不是问题。我们要先打包,同时排除boto3及其依赖。

标签: python pip aws-lambda


【解决方案1】:

虽然您不能告诉 pip“安装除 boto3 所需的所有依赖项之外的所有依赖项”,但您可以通过计算来自 pip freeze 输出的 boto3ask-sdk 之间的差异来生成所需的 requirements.txt(用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 依赖项,您可以从您的 python 依赖项中保存大约 45M 的数据。 ask-sdk 依赖只有大约 7.5M(2.1M 压缩),如果需要,可以使用内置的 lambda 代码编辑器。

【讨论】:

  • 对于多年后找到这个答案的人来说,urllib3 现在是 AWS Python lambdas 的标准部分。您可以在此处检查您的 python 版本是否有它以及已经预安装了哪些其他库:insidelambda.com
【解决方案2】:

你可以试试这个选项

  --no-dependencies

忽略所有依赖项。

要排除特定的,你可以把它放在需求文件中并传递它:

pip install --no-deps -r requirements.txt

【讨论】:

  • 正如我在上面关于--no-deps 的问题中提到的那样——我们需要手动跟踪我们希望避免的依赖项(boto3 除外,例如ask-sdk-core)。
【解决方案3】:

这会起作用

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

在上面的命令之后,我用 tree 检查了 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)。
猜你喜欢
  • 2016-08-21
  • 2019-11-24
  • 2018-09-27
  • 2011-01-20
  • 2021-05-29
  • 2023-04-03
  • 2016-01-23
  • 2021-10-05
  • 2020-10-04
相关资源
最近更新 更多