我遇到了一个关于为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一样),而是通过避免根目录中的其他文件夹来保持文件结构的整洁。
发布于 2018-04-18 13:40:11
我看到一些人在lambda函数的代码中使用sys模块将子目录添加到他们的python路径.我不喜欢这样的解决方案,因为这意味着需要对每一个lambda函数这样做,并增加额外的锅炉板代码。我最后使用的解决方案是修改PYTHONPATH运行时环境变量,以包括我的子目录。例如,在我的serverless.yml中有:
provider:
environment:
PYTHONPATH: '/var/task/vendored:/var/runtime'通过将其设置为此级别的环境变量,它将应用于您在serverless.yml中部署的每个lambda函数--如果出于某些原因,您也可以将其指定为每个lambda函数级别,如果您不希望将其应用于所有这些函数。
我不知道如何自我引用PYTHONPATH的现有值,以确保在添加自定义路径的过程中没有错误地覆盖PYTHONPATH。想知道是否还有其他人。
https://stackoverflow.com/questions/49839924
复制相似问题