Python 是否可以通过serverless.yml向PATH环境变量添加路径?
创建AWS Lambda层时,执行AWS Lambda时,我的zip文件的所有内容/模块都会转到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
/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层添加可导入模块和包的惯用方法不是这些。见下文。