我们正在开发一个Alexa函数,用于Python中的Alexa技能,并使用pip将ask-sdk包安装到我们的dist/目录中:
pip install -t dist/ ask-sdk问题在于-t dist/,因为pip希望拥有所有的依赖项,即使它们是在系统范围内安装的。
现在,ask-sdk有一个依赖于boto3的特性,这会吸引很多其他的包。但是,AWS运行时环境提供了boto3,不需要将其及其依赖项打包到代码中。我确实在系统中安装了boto3,import boto3可以工作,所以我认为pip应该很高兴,但是因为-t dist/,它总是安装它。
我是否可以以某种方式安装系统中不存在的ask-sdk及其依赖项,例如ask-sdk-core,但不安装已经安装的依赖项?
一种方法是列出所有模块并使用pip --no-deps,但这意味着要经常手动跟踪依赖项,我们希望避免这种情况。
不知何故,我想告诉pip:如果包已经安装,即使不是在-t dist/中,也不要在dist/中放置一个副本。
这有可能吗?
谢谢!
发布于 2019-01-28 23:19:33
虽然您不能告诉pip“安装除boto3所需的依赖项之外的所有依赖项”,但您可以通过从pip freeze输出中计算boto3和ask-sdk之间的差异(用Python3.6.6测试)来生成所需的ask-sdk:
# 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.txtrequirements-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依赖项中保存大约4500万个数据。ask-sdk依赖项只有7.5M (2.1M压缩),如果需要,可以使用内置的lambda代码编辑器。
发布于 2018-09-01 08:08:58
你可以试试这个选项
--no-dependencies忽略所有依赖项。
要排除特定的内容,可以将其放入需求文件并传递给它:
pip install --no-deps -r requirements.txt发布于 2018-09-01 08:30:04
这会起作用的
$ 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.txthttps://stackoverflow.com/questions/52126116
复制相似问题