You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 21:24:06