首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Python依赖项打包到AWS Lambda的子目录中

将Python依赖项打包到AWS Lambda的子目录中
EN

Stack Overflow用户
提问于 2018-04-15 08:23:59
回答 1查看 6.7K关注 0票数 10

我遇到了一个关于为AWS构建Python3应用程序的关于serverlesscode.com的文章,它建议使用pip (或pip3)在/vendored子目录中安装依赖项。我喜欢这个想法,因为它使文件结构保持干净,但我在实现它时遇到了一些问题。

我使用的是Serverless框架,我的模块是以正常的方式在代码中导入的,例如from pynamodb.models import Model

我已经使用命令pip install -t vendored/ -r requirements.txt在子目录中安装了各种依赖项(每个requirements.txt),这似乎像预期的那样工作--我可以看到子目录中安装的所有模块。

但是,当函数被调用时,我得到了错误Unable to import module 'handler': No module named 'pynamodb' (其中pynamodb是已安装的模块之一)。

我可以通过将pip安装更改为项目根(即不在/vendored文件夹(pip install -t ./ -r requirements.txt)中)来解决此错误。这将安装完全相同的文件。

一定有一个我缺少的配置指向子文件夹,但谷歌并没有透露我是否需要以一种不同的方式导入我的模块,或者如果有其他的全局配置我需要改变。

总结:如何使用Pip在项目中的子文件夹中安装我的依赖项?

编辑:注意到tkwargs关于使用无服务器插件进行打包的好建议,例如,如果不使用venv,了解这一点仍然很好。其主要目的不是为了使打包变得更简单(它非常容易,就像使用pip一样),而是通过避免根目录中的其他文件夹来保持文件结构的整洁。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-18 13:40:11

我看到一些人在lambda函数的代码中使用sys模块将子目录添加到他们的python路径.我不喜欢这样的解决方案,因为这意味着需要对每一个lambda函数这样做,并增加额外的锅炉板代码。我最后使用的解决方案是修改PYTHONPATH运行时环境变量,以包括我的子目录。例如,在我的serverless.yml中有:

代码语言:javascript
复制
provider:
  environment:
    PYTHONPATH: '/var/task/vendored:/var/runtime'

通过将其设置为此级别的环境变量,它将应用于您在serverless.yml中部署的每个lambda函数--如果出于某些原因,您也可以将其指定为每个lambda函数级别,如果您不希望将其应用于所有这些函数。

我不知道如何自我引用PYTHONPATH的现有值,以确保在添加自定义路径的过程中没有错误地覆盖PYTHONPATH。想知道是否还有其他人。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49839924

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档