Python调用subprocess运行gdal_grid报ERRNO36文件名过长错误
问题根因
ERRNO 36 File name too long报错和你当前设置的2022_TestData_TrialNo2_Survey_25m_BD_ITM_Zvalue.tif文件名长度无关,本质是命令参数拼接或传参逻辑出错,导致gdal_grid把一长串非路径参数误识别为输出文件路径,常见触发场景:
-txe/-tye参数需要分别传入xmin/xmax、ymin/ymax两个数值,如果你直接把列表、元组类型的txextent/tyextent变量塞进f-string拼接,会把括号、逗号等冗余字符拼入命令,打乱参数顺序,gdal解析时参数错位,后续多段参数会被合并识别为超长文件名。- 直接给
subprocess.call传入整串命令且未设置shell=True时,Python会把整串内容当做单个可执行文件路径查找,直接触发文件名过长报错;就算加了shell=True,如果参数包含空格、特殊字符,也容易出现参数拆分错位。 - 检查
output_file变量本身是否被意外赋值为包含多段内容的超长字符串,而非预期的文件名前缀。
可行解决方案
按优先级操作:
- 优先改用subprocess官方推荐的参数列表传参方式,彻底避免字符串拼接带来的参数错位、特殊字符转义问题,参考代码:
import subprocess # 提前拆分范围参数,确认txextent、tyextent为存储两个数值的二元组/列表 x_min, x_max = txextent y_min, y_max = tyextent cmd_list = [ "gdal_grid", "-a", f"nearest:radius1={cell_size}:radius2={cell_size}:angle=0.0:min_points=0:nodata=0.0", "-ot", "Float32", "-of", "GTiff", "-txe", str(x_min), str(x_max), "-tye", str(y_min), str(y_max), "-tr", str(resolution), "-zfield", "z", shapefile, f"{output_file}.tif" ] # 执行前可打印参数列表确认每个参数位置正确 print(cmd_list) subprocess.call(cmd_list, check=True)
- 临时排查:如果暂时不改写传参逻辑,先把拼接完成的完整命令字符串打印出来,复制到终端手动执行,就能直观看出哪个位置参数拼接错误导致文件名识别错位;确认命令字符串完全正确的前提下,可临时加
shell=True参数执行,但该方式存在命令注入风险,不建议长期使用。 - 路径校验:确认输出文件的全路径(包含所有上级目录的完整路径)长度不超过所在文件系统的限制,Linux ext4单文件名长度限制255字节、全路径限制4096字节,Windows NTFS默认全路径限制260字符,如果是目录层级过深触发的限制,把输出目录改到路径更浅的位置即可。
内容的提问来源于stack exchange,提问作者hello_12039
相关产品推荐
相关产品推荐

