Parameter im Script Tool mit Python einstellen?

8

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()
Sam
quelle
Hallo Sam, willkommen bei GIS.se :) Sehen Sie, ob Sie versuchen , alles von rows =bis irowseinschließ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).
Matt Wilkie
Ich habe die Code-Formatierung in Ihrem Q korrigiert. Ein Teil der Fehlermeldung wurde von den spitzen Klammern gefressen. Zu Ihrer Information, drücken Sie im Bearbeitungsmodus [Strg] - [K], um die Codeformatierung automatisch auf den ausgewählten Text anzuwenden. Ein Block ist vier Leerzeichen eingerückt und Inline-Code mit Back Ticks: ` ` (ref)
Matt Wilkie
In Bezug auf Ihre letzte Bearbeitung sieht es so aus, als ob die in der zweiten Zeile definierte Variable tablepathstatt lesen sollte tablename. 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 eine import arcpyZeile oben in Ihrem Skript?
blah238
Wir können dies nicht für Sie debuggen - greifen Sie zu PyScripter oder einer anderen Python-IDE und beginnen Sie mit dem Debuggen. Im Gegensatz zu dem, was matt gesagt hat, sollten Sie, wenn Sie try / exception entfernen, eine vollständige Stapelverfolgung erhalten, wenn das Programm bombardiert, was Sie hoffentlich zu der Zeile führt, in der sich der Fehler befindet. Sie können den Stack-Trace auch explizit mit dem Traceback-Modul schreiben, aber wahrscheinlich ist dies mehr Arbeit als nur das Entfernen des Try / Except. Siehe auch: blogs.esri.com/Dev/blogs/geoprocessing/archive/2008/12/01/… 2D00 -Error-Handling-in-Python-script-tools.aspx
blah238
Das Problem war die Länge des Feldnamens. Anscheinend mag Python keine langen Feldnamen (> 10 Zeichen). Es scheint jetzt zu funktionieren. Ich werde morgen etwas Neues ausprobieren und ich bin sicher, dass ich auf neue Probleme stoßen werde. Aber danke für deine Vorschläge. Ich muss lernen, wie man Python-Skript debuggt. Kennen Sie Ressourcen?
Sam

Antworten:

4

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:

  1. Ersetzen Sie Ihre zwei „Output Location“ und „Output Tabelle“ Parameter mit einem einzigen Ausgabeparameter des Typs Tabelle den vollständigen Pfad zu der Ausgabetabelle zu liefern und Ihre Skriptlogik aktualisieren Sie diesen Parameter in die notwendigen Pfadkomponenten zu analysieren indem je os.path.splitnach Bedarf für die Geoverarbeitungsfunktionen, die Sie verwenden.
  2. Ändern Sie Ihre Parameter "Ausgabestandort" und "Ausgabetabelle" in Eingabeparameter (ich würde auch "Ausgabetabelle" in "Ausgabetabellenname" umbenennen, um zu verdeutlichen, dass es sich nur um den Namen der Tabelle handelt, nicht um den vollständigen Pfad dazu). Erstellen Sie einen neuen vierten Parameter vom Typ Abgeleitet und ändern Sie die ToolValidatorKlasse 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 SetParameterAsTextam 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.

blah238
quelle
2

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:

# First parameter is ID
ID = long(arcpy.GetParameterAsText(0))

# parameter is optional feature class prefix 
appPrefix = arcpy.GetParameterAsText(1)
if (not appPrefix) or (appPrefix == "#") or (len(appPrefix.strip()) == 0):
    appPrefix = ""

# Optional schema owner
schemaOwner = arcpy.GetParameterAsText(2)
if (not schemaOwner) or (schemaOwner == "#") or (len(schemaOwner.strip()) == 0):
    schemaOwner = ""
else:
    schemaOwner = schemaOwner + "."

# Optional workspace - for use with ArcGIS Desktop. No default.
workspace = arcpy.GetParameterAsText(3)
if (not workspace) or (workspace == "#") or (len(workspace.strip()) == 0):
    workspace = os.path.join(sys.path[0], connFile)

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.

Behaart
quelle
0

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".

Jason
quelle