Windows下用python-lambda-local测试AWS Lambda函数本地报错(AWS环境正常)
解决Windows下python-lambda-local测试Lambda函数的异常问题
Hey,我看你在Windows 10上用python-lambda-local测试AWS Lambda时踩了俩坑:一个是系统兼容导致的运行错误,另一个是环境变量的传入逻辑问题,我来帮你一一拆解解决:
先搞定核心运行错误:AttributeError: module 'signal' has no attribute 'SIGALRM'
这个错误的本质是Windows系统不支持Unix/Linux专属的SIGALRM信号,而python-lambda-local的超时机制刚好依赖这个信号,所以在Windows上运行直接触发报错,后续的FrameSummary序列化错误是这个初始问题引发的连锁反应。
解决这个问题最简单的办法是修改库的超时处理代码,适配Windows环境:
- 找到你的python-lambda-local安装路径,比如你这里是
c:\program files\python36\lib\site-packages\lambda_local\ - 打开
timeout.py文件,把里面的代码替换成下面的内容:
import os import sys def time_limit(seconds): # 针对Windows系统跳过SIGALRM的超时检查 if os.name == 'nt': yield return # Unix/Linux系统保留原有超时逻辑 import signal def signal_handler(signum, frame): raise TimeoutException("Timed out!") signal.signal(signal.SIGALRM, signal_handler) signal.alarm(seconds) try: yield finally: signal.alarm(0) class TimeoutException(Exception): pass
- 保存文件后重新运行测试命令,这个信号错误就会消失了。
再修正逻辑问题:环境变量未正确传入
从你的日志里看到Event: {'what_to_print1': 'Hello', 'how_many_times1': '2'},但你的代码是从os.environ(环境变量)读取what_to_print和how_many_times,这俩参数根本没传到环境变量里,所以即使运行正常,函数也会返回None。
要在Windows本地测试时传入环境变量,得用set命令临时设置:
set what_to_print=Hello && set how_many_times=2 && python-lambda-local -f lambda_handler lambda_handler.py event.json
这样你的函数就能正确读取到环境变量,执行循环打印的逻辑了。
额外推荐:用更兼容的官方工具
如果不想折腾修改源码,推荐用AWS官方的SAM CLI来做本地测试,它完全支持Windows,能精准模拟Lambda的运行环境,还能轻松处理环境变量、触发事件等,比python-lambda-local靠谱多了。
内容的提问来源于stack exchange,提问作者Kuldeep
相关产品推荐
相关产品推荐

