Python脚本在Docker中运行报UnboundLocalError变量引用错误如何解决
问题根因
- 报错的直接原因是
image_processing函数中for file in glob.glob("*.tif")循环在容器运行时未匹配到任何.tif格式文件,循环体完全未执行,rows、cols变量未被定义就被return返回,触发UnboundLocalError。 - 本地运行正常是因为本地工作目录存在匹配的
.tif文件,循环可正常执行完成变量赋值;当前Dockerfile仅拷贝了脚本文件进镜像,没有将.tif文件打包进镜像,也没有在运行容器时挂载存放.tif的本地目录,容器内工作目录无任何.tif文件,因此触发报错。 - 你提供的代码片段中
return rows, cols存在缩进错位问题,如果实际运行的代码也是该缩进层级,也会引发变量作用域错误,若本地运行正常大概率是粘贴时的格式偏差,可自行检查确认。
解决方案
方案1:将GeoTIFF文件一同打包进Docker镜像
在Dockerfile中新增ADD指令,将本地的.tif文件拷贝到容器工作目录,修改后的Dockerfile如下:
FROM continuumio/miniconda3 # 显式指定工作目录避免路径混乱 WORKDIR /app ADD docker_test.py . # 拷贝本地当前目录下所有tif文件到容器内工作目录 ADD *.tif . RUN /opt/conda/bin/conda install gdal=3.0.2 CMD [ "python", "./docker_test.py" ]
修改后重新构建镜像再运行容器即可正常执行。
方案2:运行容器时挂载存放tif文件的本地目录
无需修改Dockerfile,构建镜像后执行docker run时添加-v参数挂载本地目录到容器工作目录,命令示例如下:
# 替换<本地tif目录绝对路径>为你自己的目录路径,例如/home/xxx/dem_data docker run -v <本地tif目录绝对路径>:/app your_image_name
脚本优化建议
可以给脚本增加空匹配和文件读取异常处理逻辑,避免直接报错闪退,修改后的函数示例:
def image_processing(): tif_list = glob.glob("*.tif") # 检查是否匹配到tif文件 if not tif_list: raise FileNotFoundError("当前目录下未找到任何.tif格式文件,请检查路径配置") rows, cols = 0, 0 for file in tif_list: dem = gdal.Open(file) # 检查文件是否正常打开 if dem is None: raise RuntimeError(f"文件{file}打开失败,请检查文件完整性") rows = dem.RasterYSize cols = dem.RasterXSize return rows, cols
内容的提问来源于stack exchange,提问作者mdl518
相关产品推荐
相关产品推荐

