Odświeżanie importowanych modułów w ArcGIS Python Toolbox?

15

Używając przybornika Pythona (.pyt) w ArcMap, zwykle podążam za wzorem, w którym sam plik .pyt jest po prostu opakowaniem do zbierania argumentów wejściowych i definiowania samych narzędzi. Kod pomocniczy jest przechowywany w osobnych modułach testowanych przez jednostkę.

Przykład:

import supporting_module

class MyTool(object):

    ...

    def execute(self, parameters, messages):
        """The source code of the tool."""
        some_input = parameters[0].valueAsText
        some_output = parameters[1].valueAsText

        supporting_module.do_something(some_input, some_output)
        arcpy.SetParameter(2, some_output)

Działa to naprawdę dobrze, ale natknąłem się na jedną frustrującą kwestię podczas programowania. Kliknij prawym przyciskiem myszy -> Odśwież .pyt w ArcMap odświeża tylko kod pliku .pyt. Nie odświeża importowanych modułów, więc muszę zamykać i ponownie otwierać ArcMap za każdym razem, gdy coś tam zmieniam. Na szczęście, ponieważ testuję kod niezależnie, nie muszę tego robić toną, ale wciąż jest to poważny problem. Czy jest na to jakiś sposób? Nieco powiązane - czy jest jakiś sposób, aby w pełni odświeżyć konsolę Python (mam niestandardowy pakiet strony, który muszę również zamknąć / ponownie otworzyć ArcMap, aby również pobrać zmiany)?

Używam ArcMap 10.2.1.

Josh Werts
źródło

Odpowiedzi:

14

Znalazłem tę możliwość, /programming/1517038/python-refresh-reload

Jedynym zastrzeżeniem jest to, że jeśli masz jakieś zmienne przypisane do modułu, będą musiały zostać przypisane ponownie.

Ale jak już napisałeś powyżej, możesz to zrobić:

import supporting_module
def execute()
  reload(supporting_module)
  ...

W ten sposób za każdym razem, gdy uruchomisz narzędzie, będziesz mieć zaktualizowany moduł. Po zakończeniu programowania można to usunąć.

cndnflyr
źródło
1
Niezwykle pomocny, a to rozwiązuje prosty przykład, który opublikowałem. Jednak jeśli moduł obsługujący importuje również inne moduły pomocnicze, wówczas należy je również wywołać przy przeładowaniu. Myślę, że to najlepsze, co otrzymamy, ponieważ ma to sens ze sposobem, w jaki Python ładuje moduły - oznaczę twój jako odpowiedź, jeśli coś bardziej niezawodnego nie nadejdzie następnego dnia.
Josh Werts
Bardzo pomocny. Przekonałem się, że wystarczy zadzwonić reload()zaraz po zaimportowaniu modułu wspierającego, w górnej części pliku PYT w przyborniku. Zatem, jeśli zestaw narzędzi zawiera kilka narzędzi, nie muszę powielać przeładowania w funkcji każdego narzędzia execute().
Mike Finch
Naprawdę nie rozumiem, w jaki sposób ta odpowiedź rozwiązuje problem. Mam moje narzędzia przechowywane w plikach .py i importować je za pomocą from pyfile import Tool, dodając reload(tool)zyski typeError: reload() argument must be module. Jakieś pomysły?
Ratnanil
2
Znalazłem rozwiązanie! najpierw zaimportuj plik py jako moduł, załaduj ponownie, a następnie zaimportuj klasę w module. Zobacz: stackoverflow.com/a/6946467/4139249
Ratnanil
5

Oto inny i bardziej niezawodny sposób, niż sugerowałem wcześniej.

Sam nie korzystałem z tego modułu, ale myślę, że rozwiązałoby to twój problem:

Program ładujący moduł Pythona

Ta biblioteka implementuje moduł ładujący oparty na zależności dla Pythona. W przeciwieństwie do wbudowanej funkcji reload (), ten reloader przeładuje żądany moduł i wszystkie inne moduły zależne od tego modułu.

Biorąc pod uwagę poprzedni przykład, powinno to załadować wszystkie zależności za pomocą jednego połączenia:

import reloader
reloader.enable()

import supporting_module

def execute()
  reloader.reload(supporting_module)
  ...

Po raz pierwszy zauważyłem ten moduł, więc jeśli zastosujesz go w swoich narzędziach, skomentuj, jak dobrze dla ciebie działa.

cndnflyr
źródło
Dobre znalezisko! To działało, jeśli dodano dokładnie tak, jak pokazano. Muszę tylko kliknąć prawym przyciskiem myszy -> odświeżyć przybornik, jeśli sam plik .pyt się zmieni. Moduły pomocnicze i ich moduły podrzędne są ładowane ponownie. Jedno zastrzeżenie - czasami dostałem kilka niewyjaśnionych wyjątków i awarię ArcMap (chociaż awarie ArcMap naprawdę nie są tak nienormalne). Uwaga - testowałem to tylko z modułem wspierającym i jednym zależnym podmodułem. Może zdać relację ze stabilności w przyszłości.
Josh Werts
1
Super, dziękuję za zgłoszenie. Tak, kiedy prowadzę ArcMap, czasami czuję się jak manekin testowy.
cndnflyr
Niestety napotkałem zbyt wiele problemów ze stabilnością z tym reloaderem, więc zmieniłem wybraną odpowiedź na oryginalną wbudowaną funkcję reload (). Czasami prostsze jest lepsze!
Josh Werts