Python-Add-In nach dem Bearbeiten des Skripts neu kompilieren?

15

Ich habe ein paar Python-Addins entwickelt und frage mich nur, wie ich das Addin am besten neu kompilieren kann, wenn ich das Skript bearbeite.

Derzeit scheint es, als müsste ich das Skript bearbeiten

  1. Schließen Sie ArcMap
  2. Gehen Sie zum Ordner "Mein Add-In" und doppelklicken Sie auf die Python-Datei "makeaddin"
  3. Doppelklicken Sie auf die Python-Add-In-Datei
  4. Starten Sie ArcMap neu, damit die Änderungen wirksam werden

Wenn ich diese Schritte nicht durchführe, werden die Änderungen nicht erkannt. Das wird ziemlich nervig und zeitaufwändig, wenn ich vielleicht irgendwo eine einfache Druckzeile platzieren oder eine kleine Änderung vornehmen möchte, um ein Ergebnis zu testen.

Gibt es einen besseren Weg, dies zu tun?

Mike
quelle

Antworten:

11

Sie können die reloadin Python integrierte Funktion verwenden, um Ihr Modul automatisch neu zu laden. Was Sie tun können, ist ungefähr so:

import mymodule

def hook():
    reload(mymodule)
    mymodule.myfunction()

Dabei hook()handelt es sich um das von ArcMap aufgerufene mymoduleModul, das Sie zwischen Aufrufen bearbeiten. Möglicherweise müssen Sie sys.pathden Pfad des zu bearbeitenden Moduls bearbeiten, damit import mymoduledies nicht fehlschlägt. Oder schließen Sie das Verzeichnis in site-packages(vielleicht mit python setup.py develop).

cwa
quelle
1
Dies wäre natürlich nur während der Entwicklung hilfreich. Ich glaube, die ArcGIS-Designer möchten, dass Sie Ihr Skript testen, bevor Sie das Add-In ( resources.arcgis.com/en/help/main/10.1/index.html#/… )
cwa
Das mache ich auch. Ich benutze auch winpdb für das eingebettete Debuggen.
blah238
Danke für den Vorschlag. Dies ist etwas jenseits meiner Fähigkeiten. Ist es schwierig umzusetzen? Gibt es weitere Informationen dazu, mit denen ich lernen kann?
Mike
1
Ich bin ein Python-Entwickler mit begrenzter ArcGIS-Erfahrung, aber ich lerne es. Ich werde mit mehr Details aktualisieren, nachdem ich sie herausgefunden habe.
cwa
@ blah238 Wie haben Sie das eingebettete Debugging konfiguriert? Mein Add-In wird eine Verbindung herstellen, die Verbindung wird jedoch getrennt, nachdem sie geladen wurde.
ShaunLangley
8

Per @ blah238 Vorschlag das folgende Skript

  1. schließt ArcMap (falls geöffnet)
  2. erstellt ein Add-In
  3. Installiert das Add-In unbeaufsichtigt
  4. Öffnet das ArcMap-Dokument erneut

In dem Verzeichnis speichern, das makeaddin.py enthält:

import os

#Location of ESRIRegAddIn.exe
esri = "C:/Program Files (x86)/Common Files/ArcGIS/bin/ESRIRegAddIn.exe"
cwd = os.getcwd()
mapdoc = <path to mxd>

#Close ArcMap if it is open
try:    os.system("TASKKILL /F /IM ArcMap.exe")
except:    pass

#Create ESRI Add-in file
os.system(os.path.join(cwd, "makeaddin.py"))

#Silently install Add-in file. The name of the file is based on folder it's located in.
os.system('"{0}" {1} /s'.format(esri, os.path.split(cwd)[-1] + ".esriaddin"))

#Open test map document.
os.system(mapdoc)
Paul
quelle
Ist dies in Ihrer PythonTool_addin.py-Datei enthalten?
ShaunLangley
@ShaunLangley, nein, dies ist eine separate .py-Datei, die sich im Verzeichnis von makeaddin.py
Paul,
Tolles Drehbuch. Wie erwartet stürzt ArcMap jedoch ab, wenn das Skript versucht, die .mxd-Datei außerhalb von ArcMap zu öffnen. Gibt es eine bekannte Lösung für dieses Problem?
TheLastGIS
1
@TheLastGIS Ja. Fügen Sie die Variablen arcmap = "C:/Program Files (x86)/ArcGIS/Desktop10.3/bin/ArcMap.exe"und hinzu Map = '"{0}" {1} /s'.format(arcmap, mapdoc). Dann os.system(Map)wird es gelingen, wo os.system(mapdoc)nicht.
Alphabetasoup
2

Ich habe auf der ArcGIS-Website eine Antwort erhalten. Anscheinend ist dies die einzige Möglichkeit, Python-Addins neu zu kompilieren. Jemand hat eine Idee zu ArcGIS Ideas protokolliert, und ich habe sie ebenfalls bewertet und kommentiert.

Der ArcGIS Discussion Forum-Thread befindet sich hier .

Mike
quelle
1
Können Sie Ihrer Antwort die relevanten Links hinzufügen?
blah238
Ich wollte abstimmen, konnte aber die von @Mike erwähnte ArcGIS-Idee nicht finden.
PolyGeo
Entschuldigung, ich habe diese Antwort bis jetzt nicht gesehen. Vielen Dank an @PolyGeo für die Aktualisierung des Links zur ArcGIS-Website.
Mike
1

Im Allgemeinen verwende ich zwei Ansätze: Zum einen lassen Sie zu, dass Tools, die eigentlich nur Geoverarbeitung sind, importiert werden. Anschließend können Sie eine interaktive Python-Sitzung einrichten und reload(mymodule)wie erwähnt die neuesten Änderungen (oder Einstellungen) vornehmen Autoreload in IPython ). Wenn Sie nur Änderungen an einer Python-Toolbox vornehmen, können Sie die Toolbox neu laden, indem Sie in der Katalogansicht mit der rechten Maustaste darauf klicken und auf "Aktualisieren" klicken.

Für Code, der Benutzerinteraktion in der GUI erfordert, verwende ich das folgende Stapelskript, um den Prozess zu beschleunigen:

@echo off
echo building...
python makeaddin.py
echo installing...
start myaddin.esriaddin
echo load ArcMap...
start %HOMEDRIVE%%HOMEPATH%\Documents\ArcGIS\myaddin.mxd

Wobei myaddin.mxd Datenebenen und Kontexte enthält, die ich für das jeweilige Projekt verwende. Dadurch werden die Add-In-Installation und ArcMap gleichzeitig gestartet. Normalerweise kann ich jedoch schneller auf die Schaltfläche "Add-In installieren" klicken, als ArcGIS gestartet wird. Alternativ können Sie pausevor dem letzten Befehl einen Befehl hinzufügen , um vor dem Starten von ArcGIS auf die Eingabe zu warten.

scw
quelle
1
Sie könnten verwenden ESRIRegAddIn.exemit dem /sSchalter der Add-In automatisch installiert werden . Der Pfad zu ESRIRegAddIn auf meinem Computer lautet C:\Program Files (x86)\Common Files\ArcGIS\bin.
blah238