ArcGIS Pro升级到2.8.3后Arcpy脚本报TypeError预期字符串或字节类对象错误如何调试
问题根因
- 缺失必要依赖导入:原脚本未显式导入
os、arcpy两个核心库,旧版ArcGIS运行环境可能存在隐式加载逻辑,升级到2.8.3后该逻辑失效,导致调用相关方法时触发类型错误 - TAB文件路径生成逻辑缺陷:原自定义的
listToString函数用空格拼接文件名列表,当匹配到0个/多个符合要求的TAB文件时,会生成非法路径传入后续读取方法,直接触发类型错误;硬编码的Windows路径分隔符\\也存在跨环境兼容问题 - ArcPy 2.8+参数校验升级:原脚本额外设置了不存在的环境变量
arcpy.env.overwrite,旧版ArcPy会自动忽略无效参数,2.8+版本对参数合法性、类型的校验标准提升,会直接抛出类型错误 - 相对路径识别不稳定:ArcPy调用工具时,传入的相对路径可能因工作空间配置异常无法被正确识别,导致参数类型不符合要求
修复后的完整代码
# 导入必要依赖库 import os import arcpy import geopandas as gpd # 设置工作目录为脚本所在文件夹 abspath = os.path.abspath(__file__) dname = os.path.dirname(abspath) os.chdir(dname) ProjectFolder = dname # 匹配TAB文件,增加合法性校验 files = os.listdir(ProjectFolder) Tabfile = [i for i in files if i.endswith('Site Boundary.TAB')] # 校验匹配结果 if len(Tabfile) == 0: raise FileNotFoundError("未找到后缀为Site Boundary.TAB的文件") elif len(Tabfile) > 1: raise ValueError("匹配到多个后缀为Site Boundary.TAB的文件,请检查文件夹内容") # 生成合法TAB文件路径 TabfilePath = os.path.join(ProjectFolder, Tabfile[0]) # 导出TAB为shp Tabdata = gpd.read_file(TabfilePath, driver="MapInfo File") ShapefilePath = os.path.join(ProjectFolder, r"siteboundary.shp") Tabdata.to_file(ShapefilePath) # 配置arcpy环境,移除无效参数 arcpy.env.workspace = ProjectFolder arcpy.env.overwriteOutput = True # 多环缓冲区生成 distances = [200, 500, 1000, 2000] bufferunit = "Meters" # 传入绝对路径避免arcpy相对路径识别异常 input_shp = os.path.join(ProjectFolder, "siteboundary.shp") output_shp = os.path.join(ProjectFolder, "sitebuffer.shp") arcpy.analysis.MultipleRingBuffer(input_shp, output_shp, distances, bufferunit, "distance", "NONE") # 输出结果提示 arcpy.AddMessage("转换完成,文件位于:" + ProjectFolder) print("转换完成,文件位于:" + ProjectFolder)
运行验证步骤
- 确认脚本所在文件夹下仅存在1个以
Site Boundary.TAB结尾的文件 - 运行前先激活你克隆的ArcGIS Pro 2.8专属Python环境,避免调用到其他未安装对应依赖的Python环境
- 若仍有报错,可在脚本开头添加
import sys; print(sys.executable),确认运行使用的Python环境与你安装arcpy、geopandas的环境一致
内容的提问来源于stack exchange,提问作者Muppidi Sahaja Reddy
相关产品推荐
相关产品推荐

