Ponowna kompilacja dodatku Python po edycji skryptu?

15

Pracuję nad kilkoma dodatkami do Pythona i zastanawiam się, jaki jest najlepszy sposób na ponowne skompilowanie tego dodatku za każdym razem, gdy edytuję skrypt.

Obecnie, jeśli dokonam edycji skryptu, wydaje się, że muszę

  1. Zamknij ArcMap
  2. Przejdź do folderu Mój dodatek i kliknij dwukrotnie plik python „makeaddin”
  3. Kliknij dwukrotnie „Plik dodatku Python
  4. Uruchom ponownie ArcMap, aby zmiany zostały wprowadzone

Jeśli nie wykonam tych kroków, zmiany nie zostaną rozpoznane. To staje się dość irytujące i czasochłonne, gdy chcę gdzieś umieścić prostą linię drukowania lub wykonuję małą edycję, aby przetestować wynik.

Czy jest na to lepszy sposób?

Mikrofon
źródło

Odpowiedzi:

11

Możesz użyć wbudowanej reloadfunkcji w Pythonie, aby automatycznie przeładować moduł. Możesz zrobić coś takiego:

import mymodule

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

gdzie hook()nazywa się ArcMap i mymodulejest modułem, który edytujesz między wywołaniami. Konieczne może być dokonanie edycji w sys.pathcelu uwzględnienia ścieżki edytowanego modułu, aby import mymodulenie zawieść. Lub dołącz katalog do site-packages(być może za pomocą python setup.py develop).

cwa
źródło
1
Oczywiście byłoby to pomocne tylko podczas opracowywania; Wierzę, że projektanci ArcGIS zamierzają przetestować twój skrypt przed zbudowaniem dodatku ( resources.arcgis.com/en/help/main/10.1/index.html#/… )
cwa
To też robię. Używam również winpdb do wbudowanego debugowania.
blah238
Dzieki za sugestie. To trochę poza mój zestaw umiejętności. Czy to jest trudne do wdrożenia? Czy są jakieś dodatkowe informacje na ten temat, których mogę się nauczyć?
Mike
1
Jestem programistą python z ograniczonym doświadczeniem ArcGIS, ale uczę się tego. Zaktualizuję więcej szczegółów, gdy je rozwiążę.
cwa
@ blah238 jak skonfigurowałeś wbudowane debugowanie? Mój dodatek połączy się, ale porzuci połączenie.
ShaunLangley,
8

Według sugestii @ blah238 następujący skrypt

  1. zamyka ArcMap (jeśli jest otwarty)
  2. tworzy dodatek
  3. instaluje dodatek w trybie cichym
  4. ponownie otwiera dokument ArcMap

Zapisz w katalogu zawierającym makeaddin.py:

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)
Paweł
źródło
czy jest to uwzględnione w pliku PythonTool_addin.py?
ShaunLangley,
@ShaunLangley, nie, to jest osobny plik .py znajdujący się w katalogu makeaddin.py
Paul,
Świetny scenariusz. Jednak, zgodnie z oczekiwaniami, ArcMap przewraca się, gdy skrypt próbuje otworzyć plik .mxd poza ArcMap. Czy jest to znana poprawka?
TheLastGIS
1
@TheLastGIS Tak. Dodaj zmienne arcmap = "C:/Program Files (x86)/ArcGIS/Desktop10.3/bin/ArcMap.exe"i Map = '"{0}" {1} /s'.format(arcmap, mapdoc)powyżej. Wtedy os.system(Map)odniesie sukces tam, gdzie os.system(mapdoc)nie.
alphabetasoup
2

Otrzymałem odpowiedź na stronie ArcGIS. Najwyraźniej jest to jedyny sposób na ponowne skompilowanie dodatków do Pythona. Ktoś zalogował pomysł w ArcGIS Ideas a ja także głosowałem i skomentowałem.

Wątek Forum dyskusyjnego ArcGIS znajduje się tutaj .

Mikrofon
źródło
1
Czy możesz dodać odpowiednie linki do swojej odpowiedzi?
blah238
Chciałem głosować, ale nie mogłem znaleźć Pomysłu ArcGIS, o którym wspomina @Mike.
PolyGeo
Niestety, do tej pory nie widziałem tej odpowiedzi. Dzięki @PolyGeo za aktualizację linku do strony ArcGIS.
Mike
1

Zasadniczo używam dwóch podejść: jednym z nich jest to, że dla wszystkich używanych narzędzi, które są po prostu procesem geoprzetwarzania, zezwól na ich importowanie, a następnie możesz skonfigurować interaktywną sesję Pythona i zrobić, reload(mymodule)jak wspomniano, aby uwzględnić najnowsze zmiany (lub skonfigurować autoreload w IPython ). Jeśli dokonujesz tylko zmian w przyborniku Python, możesz przeładować przybornik, klikając go prawym przyciskiem myszy w widoku katalogu i klikając „Odśwież”.

W przypadku kodu wymagającego interakcji użytkownika w GUI używam następującego skryptu wsadowego, aby przyspieszyć proces:

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

Gdzie myaddin.mxd ma warstwy danych i kontekst, których używam do konkretnego projektu. Spowoduje to jednoczesne uruchomienie instalacji dodatku i ArcMap, ale zwykle mogę kliknąć przycisk „Zainstaluj dodatek” szybciej niż ArcGIS się uruchomi. Alternatywnie możesz dodać pauseprzed ostatnim poleceniem, aby czekać na dane wejściowe przed uruchomieniem ArcGIS.

scw
źródło
1
Można korzystać ESRIRegAddIn.exez /sprzełącznika, aby zainstalować dodatek cicho. Ścieżka do ESRIRegAddIn na moim komputerze to C:\Program Files (x86)\Common Files\ArcGIS\bin.
blah238