在AWS Lambd的子目录中打包Python依赖项

2024-10-01 17:40:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我遇到了一个关于为AWS Lambda构建python3应用程序的article on serverlesscode.com,它建议使用pip(或pip3)在/vendord子目录中安装依赖项。我喜欢这个想法,因为它可以保持文件结构的整洁,但是我在实现它时遇到了一些问题。在

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

我使用命令pip install -t vendored/ -r requirements.txt来安装我的各种依赖项(per要求.txt)在子目录中,它似乎工作正常-我可以看到子目录中安装的所有模块。在

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

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

一定有一个我没有找到的指向子文件夹的配置,但是google没有透露是否需要以不同的方式导入模块,或者是否需要更改其他全局配置。在

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

编辑:注意到tkwargs关于使用无服务器插件进行打包的好建议,例如,了解如何在没有venv的情况下实现这一点还是很有帮助的。主要目的并不是为了使打包更简单(这和pip一样很容易),而是通过避免在根目录中添加其他文件夹来保持文件结构的整洁。在


Tags: 模块installpip文件import服务器txt文件夹
1条回答
网友
1楼 · 发布于 2024-10-01 17:40:58

我见过一些人在他们的lambda函数的代码中使用sys模块将子目录(在本例中是vendor)添加到他们的python路径中。。。我不喜欢将其作为解决方案,因为这意味着需要为每个lambda函数都这样做,并添加额外的锅炉板代码的需要。我最终使用的解决方案是修改PYTHONPATH运行时环境变量,以包含我的子目录。例如,在我的无服务器.yml我有:

provider:
  environment:
    PYTHONPATH: '/var/task/vendored:/var/runtime'

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

在添加自定义路径“/var/task/vendorded”的过程中,我不知道如何自引用PYTHONPATH的现有值以确保不会错误地覆盖它。。。很想知道有没有人有。在

相关问题 更多 >

    热门问题