在AWS Lambda中调用gdal2tiles.py提示command not found如何解决
报错根因
你遇到的sh: gdal2tiles.py: command not found错误,本质是AWS Lambda运行环境的系统PATH路径没有包含GeoLambda层中gdal2tiles.py脚本的存放目录,系统无法定位到该可执行脚本。
Lambda的所有自定义层都会默认挂载到/opt目录下,GDAL相关的工具脚本通常会放在/opt/bin或者/opt/python/bin路径下。
解决步骤
- 第一步:先定位gdal2tiles.py的实际存放路径,在Lambda中临时运行如下代码,从日志中获取完整路径:
import json import os from osgeo import gdal def lambda_handler(event, context): # 搜索全opt目录下的gdal2tiles.py os.system("find /opt -name 'gdal2tiles.py'")
- 第二步:使用绝对路径直接调用脚本,假设你查到的路径是
/opt/bin/gdal2tiles.py,修改你的业务代码即可:
import json import os from osgeo import gdal def lambda_handler(event, context): # 直接用完整绝对路径调用,同时修正你原代码的参数错误 os.system("/opt/bin/gdal2tiles.py -p mercator -z 0-6 test.jpg /tmp/tiles_output")
- 如果你不想每次都写绝对路径,也可以提前把脚本所在目录加到系统PATH中:
import json import os from osgeo import gdal def lambda_handler(event, context): # 把gdal2tiles.py所在目录加到PATH,示例路径请替换为你实际查到的路径 os.environ['PATH'] = f"/opt/bin:{os.environ['PATH']}" os.system("gdal2tiles.py -p mercator -z 0-6 test.jpg /tmp/tiles_output")
额外注意事项
- 你原代码中的参数存在两处语法错误:
-p参数后必须指定投影类型(常用的是mercator/webmercator),-z参数后的缩放范围不需要加中括号,直接写0-6即可 - gdal2tiles.py默认会在当前工作目录生成切片文件,Lambda仅允许在
/tmp目录下写入文件,你需要在调用时指定输出目录到/tmp下,避免写入权限报错 - 如果直接调用脚本失败,可以尝试指定python3来执行,避免脚本头部的shebang指向的python版本在Lambda环境中不存在
- 如果你是自行打包的GeoLambda层,需要确认gdal2tiles.py的权限为755,官方预构建的GeoLambda层一般已经做好了权限配置
内容的提问来源于stack exchange,提问作者Philiz
相关产品推荐
相关产品推荐

