Serverless: Invoke Local for Python找不到处理程序模块

创建于 2017-01-30  ·  3评论  ·  资料来源: serverless/serverless

1.如果您有问题而不是错误/功能请求,请在http://forum.serverless.com上提出。2.请检查是否已存在问题,因此没有重复项。3.检查并遵循我们的准则: https://github.com/serverless/serverless/blob/master/CONTRIBUTING.md 4.填写整个模板,以便我们对该问题有一个很好的概述。5.不要删除模板的任何部分。 如果不适用,请将其留空,将其留在第6期中。请按照模板进行操作,否则我们将要求您更新它

这是(错误报告)

描述

对于错误报告:

  • 什么地方出了错?

我试图使用无服务器v1.6.0在本地运行python lambda函数,但收到一个错误,提示找不到我的处理程序模块。

我预计这将起作用,因为此功能是在#2862中实现的

我怀疑这可能是由于我的文件夹结构引起的。 在我的情况下,python代码存储在src/serverless_lambda.py ,我使用一个激活的虚拟环境和一个setup.py。

设置setup.py使得python可以在src/*文件夹中找到模块,但是serverless invoke local似乎无法像python / pip那样找到包。

(venv) $:serverless-lambda-template gmetzker$ serverless invoke local --function serverlessLambda --data '{"command": "joke"}'
Traceback (most recent call last):
  File "/Users/gmetzker/hli-git/serverless-lambda-template/node_modules/serverless/lib/plugins/aws/invokeLocal/invoke.py", line 56, in <modul
e>

    module = import_module(args.handler_path.replace('/', '.'))
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
ImportError: No module named serverless_lambda

这是创建项目设置的方式:

-- src
    -- __init__.py
    -- serverless_lambda.py
-- serverless.yml
-- setup.py
-- venv
  1. 创建虚拟环境
virtualenv venv
  1. 激活虚拟环境
source ./venv/bin/activate
  1. 在根目录中创建setup.py/src/serverless_lambda查找模块
from setuptools import Command, find_packages, setup


setup(
    name='serverless-lambda',
    version="1.0.0",
    author = 'Gary Metzker',
    py_modules='src/serverless_lambda',
    install_requires=[
        'boto3',
        'requests'
    ],
    packages = find_packages('src'),
    package_dir={'':'src'},
    extras_require = {
        'test': ['coverage', 'pytest', 'pytest-cov', 'pytest-json', 'mock'],
    },
    entry_points='''
        [console_scripts]
        serverless-lambda=serverless_lambda:main
    '''

)
  1. 安装pip依赖项(源于setup.py
pip install --editable .
  1. 在项目根目录中创建serverless.yml文件。

service: serverlessLambdaTemplate

custom:
  stage: ${opt:stage, self:provider.stage}
  lambdaBaseName: serverless-template-lambda

provider:
  name: aws
  runtime: python2.7
  stage: dev
  region: us-west-2  

package:
  # Use package.sh to create package.zip before deploying.
  artifact: package.zip


functions:
  serverlessLambda:
    name: serverless-template-lambda-${self:custom.stage}
    handler: serverless_lambda.entry_point
  1. 尝试在本地运行无服务器:
serverless invoke local --function serverlessLambda --data '{"command": "joke"}'

还要注意的另一件事是,当我部署lambda时,通常会有一个单独的package.sh脚本,用于创建工件package.zip 。 在脚本中,将所有*.py文件从src/*压缩到zip的根目录中。 此外,虚拟环境站点包已添加到zip中。

  • 您期望发生了什么?
    我希望无服务器可以使用setup.py指定的相同包上下文,并在虚拟环境中使用pip install --editable .注册该包上下文。

它应该能够找到src/serverless_lambda.py

  • 您使用的配置是什么?
    往上看。

  • 您从提供商那里看到了什么堆栈跟踪或错误消息?

错误

Traceback (most recent call last):
  File "/Users/gmetzker/hli-git/serverless-lambda-template/node_modules/serverless/lib/plugins/aws/invokeLocal/invoke.py", line 56, in <modul
e>

    module = import_module(args.handler_path.replace('/', '.'))
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
ImportError: No module named serverless_lambda

对于功能建议:

  • 什么是用例应解决。 您对它的描述越详细,对我们来说就越容易理解。
  • 为python lambda函数运行本地
  • 使用python虚拟环境创建更干净的开发环境
  • 将源代码存储在/src/lambda_handler.py类的嵌套文件夹中,以便目录结构更整洁且源代码分开。
  • 使用lambda setup.py来干净地安装python依赖项并指定包和模块的位置。
  • 使用单独的package.sh脚本将/src/*.py和虚拟环境文件捆绑到lambda.zip中。 我将单独为我们的CI / CD系统执行此操作。

    • 如果有其他配置,它将如何显示

相似或相关的问题:

  • #2862

附加数据

  • 您正在使用的无服务器框架版本
    1.6.0
  • 作业系统
    OSX

  • 堆栈跟踪

  • 提供程序错误消息

最有用的评论

不知道这是否与上述问题有关,但是如果有人通过Google来到这里,请尝试以下操作:

npm install serverless --save-dev;
./node_modules/serverless/bin/serverless invoke local --function transferContent --data '{"content_type":"scholarship"}'

所有3条评论

对于部署打包,您可能想要签出我也写的serverless-python-requirements ,但仍然需要推送2.0.0的稳定版本。

自#3346起就应解决此问题(请参阅:https://github.com/serverless/serverless/pull/3346#issuecomment-285469254)。

如果此问题仍然存在,请随时重新打开!

不知道这是否与上述问题有关,但是如果有人通过Google来到这里,请尝试以下操作:

npm install serverless --save-dev;
./node_modules/serverless/bin/serverless invoke local --function transferContent --data '{"content_type":"scholarship"}'

此页面是否有帮助?
0 / 5 - 0 等级