Instructions pour l'organisation des boîtes à outils Python (.pyt) dans ArcGIS

17

Pour l'une de mes tâches, je dois créer une boîte à outils avec trois outils (scripts python).

Au lieu de tbx ordinaire, j'ai décidé de l'écrire en tant que Python Toolbox (pyt).

Tout est clair sauf la "bonne" façon d'organiser le code.

Comme j'ai trois outils, ce n'est pas un bon moyen de les stocker dans un fichier (pyt). J'ai donc décidé de conserver chaque outil dans un fichier .py distinct.

Voici un problème: quelle est la bonne façon d'organiser plusieurs fichiers avec PYT pour la distribution ou le déploiement sur ArcGIS for Server? Dois-je les garder au même niveau avec le fichier PYT ou dois-je les placer dans un sous-répertoire (c'est-à-dire "Outils")?

Pouvez-vous recommander des directives Esri ou faire référence à un exemple de "grande boîte à outils PYT"?

Je n'ai rien trouvé sur ce sujet. Dans la version 10.0, il y avait une structure de dossiers appelée ToolShare que j'ai utilisée.

C'est plus une question de style de codage. Parce que l'idée de créer un fichier PYT avec 500-1000 lignes de code ou plus ne me semble pas bonne et je pense que ce n'est pas de manière "pythonique".

Alex Markov
la source
1
"L'idée de créer un fichier PYT avec 500-1000 lignes de code ou plus ne me semble pas bonne". Tu n'es pas seul, Alex. Aujourd'hui, j'ai rapidement déclaré que .pyt est une invention de l'esprit malade. Et je ne le regretterai pas.
Remigijus Pankevičius

Réponses:

17

Jetez un œil à ce fil sur le forum ArcGIS. Fondamentalement, utilisez simplement des modules python standard ou une structure de package et importez vos outils dans la boîte à outils python.

Quelque chose comme:

#  \--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
la source
J'ai trouvé que cela fonctionne bien dans ArcGIS Desktop, mais lors de la publication d'un service de géotraitement sur une instance d'ArcGIS Server, il perd tous les scripts et packages, à l'exception du fichier .pyt. Il peut être possible de déposer manuellement les scripts dans le déploiement, mais cela augmente la complexité.
Gnat
3
@Gnat Oui, les pensées de Luke sont aussi mon expérience. Les services de publication d'ESRI ne reconnaissent aucune des from x import yimportations de style. (C'est tout à fait ridicule, au fait.) Cependant, je pense que vous pouvez laisser votre self.toolsdéfinition seule et l'utiliser import toolpackage.script_a.Tool1 as Tool1.
jpmc26
1
L'alias doit être court et ne contenir que des lettres, c'est-à-dire self.alias = "mtt"
Curtis Price
2
Étant donné que je viens de passer une heure à apporter des modifications à mon code d'outils et à essayer de le faire apparaître dans l'outil graphique d'Arcmap, je voudrais partager cela. Si vous apportez des modifications à votre code en dehors du fichier pyt et que vous souhaitez le voir reflété dans l'interface utilisateur, vous devez redémarrer ArcMap / Catalog. Vous pouvez appuyer sur Actualiser dans la boîte à outils tout ce que vous voulez, cela ne semble que recharger le pyt lui-même. Il ne trouvera pas les modifications apportées à l'autre code.
TurboGus
1
@TurboGus gis.stackexchange.com/q/91112/2856
user2856