Python “如何修复”;无法导入模块";AWS lambda中的错误
我写了一个脚本来帮助我自动创建新的微服务。它通过获取bitbucket存储库的URI和AWS凭据来工作。它克隆存储库,添加一个bitbucket-pipelines.yml文件。通过调用CLI创建新的lambda函数,并使用模板zip作为基本代码。它还将lambda处理程序设置为Python “如何修复”;无法导入模块";AWS lambda中的错误,python,amazon-web-services,aws-lambda,bitbucket-pipelines,Python,Amazon Web Services,Aws Lambda,Bitbucket Pipelines,我写了一个脚本来帮助我自动创建新的微服务。它通过获取bitbucket存储库的URI和AWS凭据来工作。它克隆存储库,添加一个bitbucket-pipelines.yml文件。通过调用CLI创建新的lambda函数,并使用模板zip作为基本代码。它还将lambda处理程序设置为main.lambda\u处理程序。然后将必要的存储库变量添加到bitbucket并提交项目文件。然后,管道运行并更新lambda上的代码。在我试着运行Lambda之前,一切似乎都很好 这是bitbucket-pipel
main.lambda\u处理程序
。然后将必要的存储库变量添加到bitbucket并提交项目文件。然后,管道运行并更新lambda上的代码。在我试着运行Lambda之前,一切似乎都很好
这是bitbucket-pipelines.yml文件
image: peteremil/zipaws
pipelines:
default:
- step:
name: Deploy code to S3
deployment: staging
script:
- mkdir packages
- pip install -r requirements.txt --target=packages
- chmod 777 -R *
- zip -r $semver.zip .
- aws s3 cp $semver.zip s3://{code_s3_bucket}/$staging_location/
- aws lambda update-function-code --region $aws_region --function-name {function_name}-function --s3-bucket {code_s3_bucket} --s3-key $staging_location/$semver.zip
这是main.py文件
import json
import os
import sys
import requests
packages_path = os.path.join(os.path.split(__file__)[0], "packages")
sys.path.append(packages_path)
def main(local_id):
return {
"success" : local_id
}
def lambda_handler(event, context):
local_id = event["queryStringParameters"]["local_id"]
response = main(local_id)
return {
"statusCode": 200,
"headers": {"content-type": "application/json"},
"body": json.dumps(response)
}
if __name__ == '__main__':
local_id = sys.argv[-1]
response = main(local_id)
print(response)
我创建了以下测试事件
{
"queryStringParameters": {
"local_id": "00000000"
}
}
我创建的事件的预期结果应该是
{
"statusCode": 200,
"headers" : {"content-type": "application/json"},
"body" : {
{
"success" : "00000000"
}
}
但是lambda执行失败,给了我
{
"errorMessage": "Unable to import module 'main'"
}
我尝试重命名处理程序,获取另一个工作lambda(从控制台手动创建)的设置,并查看是否有任何差异,但我总是得到相同的错误。但是main.py文件在内联代码编辑器中显示良好
更新1
我在main.py中添加了
import requests
行,因为这是问题的根源。我认为它是无害的,这就是为什么我没有将它包含在原始问题正文中。事实证明,在我的代码中,我在packages\
文件夹中安装了一个库的导入,但我在将文件夹添加到sys.path
之前导入了它,因此解决方案是在将packages\u路径添加到sys.path
之后导入请求
main.py现在是这样开始的
import json
import os
import sys
packages_path = os.path.join(os.path.split(__file__)[0], "packages")
sys.path.append(packages_path)
import requests #moved this line down after adding packages_path to sys.path
您不需要main
您可以指定上载代码时的入口点,在本例中,该入口点将是您的处理程序
function@aws_apprentice如果您指的是main()
函数,我这样做只是为了更容易在本地或lambda上运行代码,但我明白了你的观点,如果你临时用最简单的lambda函数替换main.py的内容(没有导入,没有uu main_u处理,和一个只做打印(事件)的普通lambda_处理程序),它是否加载并工作?@jarmod Yes,它起作用了,这使我意外地发现了这个问题。非常感谢。我现在就发布答案。还有一行代码,我认为这行代码是无害的,忘了包括在内,但结果导致了问题,所以我将编辑原始问题以添加它。对不起,太好了,这是我的希望。这是一个导入错误,这一事实强烈暗示模块中存在编码错误。