Richtlinien zum Organisieren von Python-Toolboxes (.pyt) in ArcGIS

17

Für eine meiner Aufgaben muss ich eine Toolbox mit drei Werkzeugen (Python-Skripten) erstellen.

Anstelle von gewöhnlichem tbx habe ich beschlossen, es als Python Toolbox (pyt) zu schreiben.

Alles ist klar außer der "guten" Art, den Code zu organisieren.

Da ich drei Tools habe, ist es nicht gut, sie in einer Datei (pyt) zu speichern. Daher habe ich beschlossen, jedes Tool in einer separaten .py-Datei zu speichern.

Hier ist ein Problem: Wie lassen sich mehrere Dateien mit PYT für die Verteilung oder Bereitstellung in ArcGIS for Server organisieren? Soll ich sie mit der PYT-Datei auf dem gleichen Stand halten oder in einem Unterverzeichnis (zB "Tools") ablegen?

Können Sie irgendwelche Esri-Richtlinien oder Referenzbeispiele für "große PYT-Toolbox" empfehlen?

Ich habe nichts zu diesem Thema gefunden. In Version 10.0 gab es eine sogenannte ToolShare-Ordnerstruktur, die ich verwendet habe.

Dies ist eher eine Frage des Codierungsstils. Weil die Idee, eine PYT-Datei mit 500-1000 oder mehr Codezeilen zu erstellen, für mich nicht gut aussieht und ich glaube, dass es kein "pythonischer" Weg ist.

Alex Markov
quelle
1
"Die Idee, eine PYT-Datei mit 500-1000 oder mehr Codezeilen zu erstellen, gefällt mir nicht". Du bist nicht allein, Alex. Heute habe ich prompt festgestellt, dass .pyt eine Erfindung des kranken Geistes ist. Und ich werde es nicht bereuen.
Remigijus Pankevičius

Antworten:

17

Schauen Sie sich diesen Thread im ArcGIS-Forum an. Verwenden Sie im Grunde nur Standard-Python-Module oder eine Paketstruktur und importieren Sie Ihre Werkzeuge in die Python-Toolbox.

Etwas wie:

#  \--SomeDir
#     |  toolbox.pyt
#     \--toolpackage
#        |  __init__.py
#        |  script_a.py
#        |  script_b.py


#----------------------------
#The .pyt file
#----------------------------

import arcpy
import toolpackage.script_a.Tool1 as Tool1
import toolpackage.script_a.Tool2 as Tool2
import toolpackage.script_b.Tool3 as Tool3

class Toolbox(object):
    def __init__(self):
        """Define the toolbox (the name of the toolbox is the name of the
        .pyt file)."""
        self.label = "MultiTool Toolbox"
        self.alias = "mtt"

        # List of tool classes associated with this toolbox
        self.tools = [Tool1, Tool2, Tool3]
user2856
quelle
Ich habe festgestellt, dass dies in ArcGIS Desktop einwandfrei funktioniert. Wenn Sie jedoch einen Geoverarbeitungs-Service auf einer ArcGIS Server-Instanz veröffentlichen, gehen alle Skripts und Pakete mit Ausnahme der .pyt-Datei verloren. Es ist möglicherweise möglich, die Skripte manuell in die Bereitstellung einzufügen, dies erhöht jedoch die Komplexität.
Gnat
3
@Gnat Ja, Lukes Gedanken sind auch meine Erfahrung. Die Publishing-Services von ESRI erkennen keinen der from x import yFormatimporte. (Das ist übrigens völlig lächerlich.) Ich glaube jedoch, Sie können Ihre self.toolsDefinition in Ruhe lassen und verwenden import toolpackage.script_a.Tool1 as Tool1.
jpmc26
1
Der Alias ​​sollte kurz sein und nur Buchstaben enthalten, dh self.alias = "mtt"
Curtis Price
2
Da ich gerade eine Stunde damit verbracht habe, Änderungen an meinem Werkzeugcode vorzunehmen und zu versuchen, ihn in der Werkzeug-GUI in Arcmap wiederzugeben, möchte ich dies mitteilen. Wenn Sie Änderungen an Ihrem Code außerhalb der Pyt-Datei vornehmen und möchten, dass sich diese in der Tool-GUI widerspiegeln, müssen Sie ArcMap / Catalog neu starten. Sie können in der Toolbox auf "Aktualisieren" klicken, was immer Sie möchten, und nur den Pyt selbst neu laden. Die Änderungen am anderen Code werden nicht gefunden.
TurboGus
1
@TurboGus gis.stackexchange.com/q/91112/2856
user2856