一个关于Toolbox运行自定义Python脚本运行问题

我最近两天在家写了两个Python文件,并在Toolbox中新建了一个工具箱,配置了Python脚本和输入输出参数,有一个昨天上午还运行正常,另外一个下午写的还没调试,但是昨天傍晚开始两个文件运行失败,就连之前运行正常的也不行了,之前运行正常的,运行到pCursor = arcpy.da.InsertCursor(strFeatureClass,["shape@"])就出错,提示对应shape文件打不开,另外一个文件,运行到with arcpy.da.SearchCursor(strFeatureClass,['SHAPE@']) as pCursor:就出错。有哪位高手知道这是啥问题吗?如果有必要的话,我可以把完整的代码贴出来。
已邀请:

tranlynn_lau

赞同来自:

#============以下是第一个文件代码===============
 import arcpy
import os
import sys 

reload(sys)
sys.setdefaultencoding('utf-8')
pCursor = None

try:
    #打开界址点坐标文件(需要注意中文路径转换)
    txtCoorFile = arcpy.GetParameterAsText(0)
    pCoorFile = open(txtCoorFile,'r')
    #读取所有界址点坐标串
    pCoorLines = pCoorFile.readlines()
    pCoorFile.close()
    #定义多边形数组
    pArrayPolygons=arcpy.Array()
    #初始化圈号
    QuanHao = '0'
    pArrayPolygon = None
    for pCoorLine in pCoorLines:
        #剔除换行回车符
        pCoorLine = pCoorLine.strip()
        pCoors = str(pCoorLine).split(',')
        #判断是否是”界址点号,圈号,X坐标,Y坐标” 格式
        if len(pCoors) == 4:
            #判断上一行与当前行的圈号是否相等,如果不相等,则要判断是第一行还是新增一个地块
            if QuanHao != pCoors[1]:
                #如果当前地块不为空,则将该地块添加到多边形中
                if pArrayPolygon != None:
                    pArrayPolygons.add(pArrayPolygon)
                #重置当前地块 并将当前坐标点添加到当前地块中
                pArrayPolygon=arcpy.Array()
                pArrayPolygon.add(arcpy.Point(float(pCoors[3]),float(pCoors[2])))
                #赋值当前地块圈号
                QuanHao = pCoors[1]
            else:
                #将当前坐标点添加到当前地块中
                pArrayPolygon.add(arcpy.Point(pCoors[3],pCoors[2]))
        else:
            continue;

    #如果多边形不为空,则将该地块添加到多边形中
    if pArrayPolygon != None:
        pArrayPolygons.add(pArrayPolygon)

    #赋值新建SHAPE地址
    strFeatureClass = arcpy.GetParameterAsText(1)
    #创建SHAPE文件
    arcpy.CreateFeatureclass_management(os.path.dirname(strFeatureClass),os.path.basename(strFeatureClass),"POLYGON")
    #新增一个要素记录
    pCursor = arcpy.da.InsertCursor(strFeatureClass,["shape@"])
    #将当前多边形保存到要素记录中
    pCursor.insertRow([arcpy.Polygon(pArrayPolygons)])
    print("入库完成!")
except arcpy.ExecuteError:
    arcpy.AddError(arcpy.GetMessages(2))
except Exception as e:
    arcpy.AddError(e)
    print("发生错误,错误信息如下:->\r\n" + str(e))
finally:
    if pCursor:
        del pCursor
 
#============以下是第二个文件代码===============
 
import arcpy
import os
import sys 

#要素游标和多边形变量初始化
pCursor = None
pArrayPoints=None

try:
    #获取Shape文件路径和界址点坐标文件路径
    strFeatureClass = arcpy.GetParameterAsText(0)   
    txtCoorFile = arcpy.GetParameterAsText(0)
    strFeatureClass = strFeatureClass.decode('utf-8')
    txtCoorFile = txtCoorFile.decode('utf-8')  
    #设置Shape文件工作空间
    arcpy.env.workspace = os.path.dirname(strFeatureClass)
    #打开待写入的界址点坐标文件
    pCoorFile = open(txtCoorFile,'w')
    #初始化圈号和界址点点号变量
    intQuanHao_Wai = 0
    intDianNo_All = 0
    #搜索Shape文件各要素
    with arcpy.da.SearchCursor(strFeatureClass,['SHAPE@']) as pCursor:
        for pFeatureRow in pCursor:
            for pPartPoints in pFeatureRow[0]:
                #外圈号累加1
                intQuanHao_Wai+=1
                #以下代码是为获取当前圈号多边形对应的面积和界址点数量
                #当前圈号对应界址点数变量初始化
                intDianNums = 0
                pArrayPoints=arcpy.Array()
                for pPoint in pPartPoints:
                    if pPoint:
                        intDianNums+=1
                        pArrayPoints.add(arcpy.Point(pPoint.Y,pPoint.X))
                #由Array点组创建生成当前圈号多边形面
                pPolygon = arcpy.Polygon(pArrayPoints)
                #写入当前圈号地块头信息,格式如下:
                #界址点数, 地块面积, 地块编号, 地块名称, 记录图形属性(点、线、面), 图幅号, 地块用途, 地类编码,@
                pCoorFile.write(str(intDianNums) + ',' +  "{:.4f}".format(pPolygon.area) +  str(intQuanHao_Wai) + ',地块' + str(intQuanHao_Wai) + ',面,,,@\n')
                #初始化内圈号及其对应的起始点号、累计点号和起始点对象
                intQuanHao_Nei = 1
                intDianNo_QiShi = 0
                intDianNo_LeiJi = 0
                pPoint_QiShi = None
                for pPoint in pPartPoints:
                    if pPoint:
                        #内圈号和界址点点号累加1
                        intDianNo_LeiJi+=1
                        intDianNo_All+=1
                        #如果是第一个点,则将第一个点序号和点对象记录下来,并往文件中写入坐标串信息;
                        #如果不是第一个点,则直接写入坐标串信息(最后一个点需要与第一点判断)
                        if intDianNo_LeiJi==1:
                            pPoint_QiShi = pPoint
                            intDianNo_QiShi = intDianNo_All
                            pCoorFile.write('J' + str(intDianNo_All) + ',' + str(intQuanHao_Nei) + ',' + "{:.4f},{:.4f}".format(pPoint.Y, pPoint.X)+ '\n')
                        else:
                            if "{:.4f},{:.4f}".format(pPoint.Y, pPoint.X) == "{:.4f},{:.4f}".format(pPoint_QiShi.Y, pPoint_QiShi.X):
                                pCoorFile.write('J' + str(intDianNo_QiShi) + ',' + str(intQuanHao_Nei) + ',' + "{:.4f},{:.4f}".format(pPoint.Y, pPoint.X)+ '\n')
                                intDianNo_All-=1
                            else:
                                pCoorFile.write('J' + str(intDianNo_All) + ',' + str(intQuanHao_Nei) + ',' + "{:.4f},{:.4f}".format(pPoint.Y, pPoint.X)+ '\n')
                    else:
                        #如果为空,代表又重新出现下一个内圈(即洞),则累计点号与起始点号重置0,内部圈号累加1
                        intDianNo_LeiJi = 0
                        intDianNo_QiShi = 0
                        intQuanHao_Nei+=1
    #关闭文件
    pCoorFile.close()
    print("写入完成!")
except arcpy.ExecuteError:
    arcpy.AddError(arcpy.GetMessages(2))
except Exception as e:
    arcpy.AddError(e)
    print("发生错误,错误信息如下:->\r\n" + str(e))
finally:
    if pArrayPoints:
        del pArrayPoints
    if pCursor:
        del pCursor

要回复问题请先登录注册