Python 是否可以通过serverless.yml向PATH环境变量添加路径?

Python 是否可以通过serverless.yml向PATH环境变量添加路径?,python,amazon-web-services,aws-lambda,aws-lambda-layers,Python,Amazon Web Services,Aws Lambda,Aws Lambda Layers,创建AWS Lambda层时,执行AWS Lambda时,我的zip文件的所有内容/模块都会转到/opt/。这很容易变得麻烦和令人沮丧,因为我必须在所有lambda上使用绝对导入。例如: import json import os import importlib.util spec = importlib.util.spec_from_file_location("dynamodb_layer.customer", "/opt/dynamodb_layer/customer.py") modu

创建AWS Lambda层时,执行AWS Lambda时,我的zip文件的所有内容/模块都会转到
/opt/
。这很容易变得麻烦和令人沮丧,因为我必须在所有lambda上使用绝对导入。例如:

import json
import os
import importlib.util
spec = importlib.util.spec_from_file_location("dynamodb_layer.customer", "/opt/dynamodb_layer/customer.py")
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)

def fetch(event, context):

    CustomerManager = module.CustomerManager
    customer_manager = CustomerManager()

    body = customer_manager.list_customers(event["queryStringParameters"]["acquirer"])

    response = {
        "statusCode": 200,
        "headers": {
            "Access-Control-Allow-Origin": "*"
        },
        "body": json.dumps(body)
    }

    return response

所以我想知道,是否可以通过serverless.yml预先将这些/opt/PATH添加到PATH环境变量中?这样,我就可以从dynamodb_layer.customer导入CustomerManager
,而不是那种奇怪的丑陋了。

你试过设置PYTHONPATH环境变量吗?

您是否尝试添加到sys.path?

我已经为Python3.6运行时创建了Lambda层。我的My_package.zip结构是:

my_package.zip
 - python
   - lib
     - python3.6
       - site-packages
         - customer
所有依赖项都位于项目根目录中的
build
文件夹中: e、 g.
build/python/lib/python3.6/site packages/customer

myserverless.yml的相关部分

layers:
  my_package:
    path: build             
    compatibleRuntimes:     
      - python3.6
在我的Lambda中,我导入我的包,就像导入任何其他包一样:
import customer

在zip存档中,需要将模块放置在
python
子目录中,以便在Lambda中将其提取为层时,它位于
/opt/python
中。这样,您就可以直接导入模块,而无需
importlib


有关更多信息,请参阅AWS开发人员布道者提供的内容。

只要将项目正确放置在zip文件中,就不需要设置PYTHONPATH变量

zip -r my_layer_zip.zip python/
简单的模块和包目录,这些应该放在一个目录“python”中,然后将整个python/放在zip文件中作为一个层上传到AWS。不要忘记为层添加“兼容运行时”(例如Python 3.6、3.7、3.8…)设置

例如:

python/
- my_module.py
- my_package_dir
-- __init__.py
-- package_mod_1.py
-- package_mod_2.py
然后将其包含在zip文件中

zip -r my_layer_zip.zip python/
然后,当作为层访问时,无需任何ado即可导入模块:

....
import my_module
from my_package.package_mod_2 import mod_2_function
....
如果查看“/opt/python/”可以看到lambda中的包结构,它将显示my_module.py、my_package/等,这很容易使用AWS lambda测试函数进行测试,假设层连接到函数(否则代码将出错)


您知道是否有办法在无服务器环境中设置路径吗?我有一大堆文件,我不想把它们压缩到特定的目录结构中,但我希望它们最终被压缩到
/opt/python/lib/python3.6/site packages/shared
中。有没有一种方法可以做到这一点,而不用在git中以相同的目录结构组织它们?@Craig您的构建脚本可以在将目录打包到zip文件之前,以任何它认为合适的方式操纵目录。这通常称为“登台”。在这种情况下,您的构建将创建一个名为“python”的目录,然后将所需文件和包复制到其中,然后创建zip并将其作为一个层上载。看看我的答案吧!你提供的链接似乎不够明确,我需要使用我自己的软件包-因此我在下面的回答中更直接地写了一些东西,对你有好处,伙计。“你不必到处乱说每个人的答案……对不起,你很生气,”米兰——我自己在这个问题的中间,我想我会增加一些额外的信息来使用别人。这绝不是“垃圾邮件”或自我推销。我会尽力给你应得的荣誉。如果您对SO问题有了新的详细信息,我相信您也会这样做。使用Lambda层添加可导入模块和包的惯用方法不是这些。见下文。