Ich hasse es, Sie alle immer wieder mit demselben Problem zu nerven, aber ich stoße jedes Mal auf ein neues Problem, wenn ich den Code geringfügig ändere. Alles, was ich mit dem folgenden Code gemacht habe, war, Feldnamen zu ersetzen, die mit der ursprünglichen Feature-Class übereinstimmen. Jetzt funktioniert es nicht. Es gab mir
<type 'exceptions.RuntimeError'>: ERROR 999999: Error executing function.
Failed to execute (Script).
Ich habe versucht, Try / Except zum Code hinzuzufügen, der mir keine Fehlermeldungen gab, aber auch keine Ergebnisse lieferte.
Ich bin nicht sicher, was los ist? Jede Hilfe, um dies herauszufinden, wird sehr geschätzt.
import arcpy, os
Try:
roadpath = arcpy.GetParameterAsText(0)
tablepath = arcpy.GetParameterAsText(1)
datapath = os.path.split(tablepath)[0]
tablename = os.path.split(tablepath)[1]
rows = arcpy.SearchCursor(roadpath,"FROMLEFT <> 0 AND TOLEFT <> 0","","STREET_NAME_ID;FROMLEFT;TOLEFT","STREET_NAME_ID A;FROMLEFT A;TOLEFT A")
arcpy.env.workspace = datapath
if arcpy.Exists(tablename):
arcpy.DeleteRows_management(tablename)
else:
arcpy.CreateTable_management(datapath,tablename,roadpath)
arcpy.DeleteField_management(tablename,"SHAPE_Length")
irows = arcpy.InsertCursor(tablename)
first = True
for row in rows:
if first:
first = False
else:
GISID = row.GIS_ID
stid = row.STREET_NAME_ID
fl = row.FROMLEFT
tl = row.TOLEFT
if stid == prev_stid and fl <= prev_tl:
irow = irows.newRow()
irow.GIS_ID = prev_GISID
irow.STREET_NAME_ID = prev_stid
irow.FROMLEFT = prev_fl
irow.TOLEFT = prev_tl
irows.insertRow(irow)
del irow
irow = irows.newRow()
irow.GIS_ID = GISID
irow.STREET_NAME_ID = stid
irow.FROMLEFT = fl
irow.TOLEFT = tl
irows.insertRow(irow)
del irow
prev_GISID = row.GIS_ID
prev_stid = row.STREET_NAME_ID
prev_fl = row.FROMLEFT
prev_tl = row.TOLEFT
del rows, irows
except:
print arcpy.GetMessages()
rows =
bisirows
einschließlich einzuschließen ... außer Block gibt eine aufschlussreichere Fehlermeldung. Es wäre auch hilfreich, wenn Sie irgendwo ein Beispiel der Daten und des vollständigen Skripts ablegen könnten ( minus.com ist ein Ort für die einfache öffentliche Freigabe).` `
(ref)tablepath
statt lesen solltetablename
. Dies ist nur ein Tippfehler im Forum oder ist es tatsächlich so im Skript? Der Fehler deutet auf den ersteren hin. Können Sie also Beispiele für die Werte angeben, die Sie an beide Parameter übergeben? Haben Sie auch eineimport arcpy
Zeile oben in Ihrem Skript?Antworten:
Die Parameter, die Sie derzeit eingerichtet haben, sollten eigentlich keine "Ausgabeparameter" sein, da es sich um einfache Zeichenfolgenargumente für Ihre Geoverarbeitungsmethoden handelt, nicht um echte Ausgaben.
Es gibt zwei Möglichkeiten, wie Sie dies erreichen können:
os.path.split
nach Bedarf für die Geoverarbeitungsfunktionen, die Sie verwenden.ToolValidator
Klasse Ihres Skriptwerkzeugs , um ihren Wert festzulegen, nachdem die Parameter 2 und 3 validiert wurden.Die erste Methode ist wahrscheinlich der einfachere Weg - die ToolValidator-Logik ist schwierig zu finden und schwer zu debuggen.
BEARBEITEN: Tatsächlich gibt es eine dritte Option, die für Ihre Zwecke geeignet sein kann - sie ist dieselbe wie Methode zwei, aber anstatt ToolValidator zu ändern, rufen Sie
SetParameterAsText
am Ende Ihres Skripts auf, um den Wert des vierten abgeleiteten Parameters festzulegen . Ich hatte in der Vergangenheit Probleme mit SetParameterAsText in Skript-Tools, die in ModelBuilder verwendet wurden, aber es könnte jetzt behoben sein.quelle
Ich würde auch versuchen, den gesamten Code zu kommentieren und die Parameterwerte auszudrucken, die Sie übergeben. Es ist immer gut, ein bisschen zu debuggen.
Es ist auch empfehlenswert, die eingehenden Parameter zu überprüfen:
Stellen Sie dann sicher, dass Sie die Variablen ausdrucken, damit Sie sie sehen können:
arcpy.AddMessage("ID : " + str(Id))
oder
print "ID : " + str(Id)
Usw. Sie müssen wissen, dass die eingegebenen Werte kein Müll sind, da Sie immer Ihrem Schwanz nachjagen werden.
Es ist auch eine gute Übung, die Reihe / den Cur in einen Versuchsfang zu stecken.
quelle
Ich stimme bla zu, die Richtung aller Ihrer Parameter sollte "Eingabe" sein. Außerdem geben Sie den Datentyp des Werkzeugparameters 3, die Ausgabetabelle, als Dateiobjekt an. Versuchen Sie dies als "Tabelle" oder "Zeichenfolge".
quelle