防止pip安装某些依赖项

MLu*_*MLu 10 python pip aws-lambda

我们正在用 Python 为 Alexa 技能开发一个AWS Lambda函数,并pip用于将ask-sdk包安装到我们的dist/目录中:

pip install -t dist/ ask-sdk
Run Code Online (Sandbox Code Playgroud)

问题在于-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/.

那可能吗?

谢谢!

ray*_*chi 8

尽管您不能告诉 pip “安装除 boto3 所需的所有依赖项之外的所有依赖项”,但您可以requirements.txt通过计算输出之间的差异boto3ask-sdkpip 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

要将最后一组依赖项安装到文件夹:

pip install --no-deps -r requirements-final.txt -t py_lib
Run Code Online (Sandbox Code Playgroud)

通过跳过boto3依赖项,您可以从 Python 依赖项中节省大约 45M 的数据。该ask-sdk依赖性是只有约750万(2.1M压缩),允许你使用内置的拉姆达代码编辑器,如果你需要。


小智 4

您可以尝试该选项

  --no-dependencies
Run Code Online (Sandbox Code Playgroud)

忽略所有依赖项。

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

pip install --no-deps -r requirements.txt
Run Code Online (Sandbox Code Playgroud)