防止点子安装某些依赖项

时间:2018-09-01 07:55:55

标签: python pip aws-lambda

我们正在为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/中。

有可能吗?

谢谢!

3 个答案:

答案 0 :(得分:1)

尽管您不能告诉pip“安装除boto3所需的依赖项之外的所有依赖项”,但可以通过计算requirements.txtboto3之间的差异来生成所需的ask-sdk {1}}输出(使用Python 3.6.6测试):

pip freeze

# 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 依赖关系,您可以从python依赖关系中节省大约4500万数据。 boto3依赖项仅为750万(压缩后为2.1M),如果需要,您可以使用内置的lambda代码编辑器。

答案 1 :(得分:0)

您可以尝试该选项

  --no-dependencies

忽略所有依赖项。

要排除特定内容,您可以将其放在需求文件中并传递:

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

答案 2 :(得分:0)

这将起作用

$ 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