Powszechnym wzorcem kodowania stosowanym w AML było uruchamianie AML (z parametrami) wewnątrz innej AML.
Aplikacja, którą obecnie tworzę, skorzystałaby na możliwości uruchomienia skryptu Python (z parametrami) w innym skrypcie Python.
Nie wydaje się to jednak wcale proste.
Korzystając z ArcGIS 10, eksperymentuję z opakowaniem „wewnętrznego” skryptu Python w narzędzie ArcGIS, które ma parametry. Pomyślałem, że prostą sprawą jest, aby „zewnętrzny” skrypt Pythona używał arcpy.ImportToolbox do importowania zestawu narzędzi, a następnie uruchamiania w nim narzędzi. Jednak podczas testowania do tej pory wszystkie moje próby uruchomienia narzędzia „wewnętrznego” ze skryptu „zewnętrznego” wydają się po prostu pomijać narzędzie „wewnętrzne” (nie pojawia się żaden błąd).
Oto kod testowy, aby lepiej zilustrować to, co próbuję opisać.
Mój skrypt testinner.py to:
inputString = arcpy.GetParameterAsText(0)
newFC = "C:\\Temp\\test.gdb\\" + inputString
arcpy.Copy_management("C:\\Temp\\test.gdb\\test",newFC)
Mój skrypt testouter.py to:
import arcpy
inputString1 = arcpy.GetParameterAsText(0)
inputString2 = arcpy.GetParameterAsText(1)
arcpy.ImportToolbox("C:\\Temp\\test.tbx")
arcpy.testinner_test(inputString1)
arcpy.testinner_test(inputString2)
Do testinner.py jego narzędzie potrzebuje pojedynczego parametru String.
Do testouter.py jego narzędzie potrzebuje dwóch parametrów String
Oba narzędzia są umieszczone w pliku test.tbx.
Test.gdb potrzebuje tylko jednej pustej klasy funkcji o nazwie test.
Po skompletowaniu powyższego uruchomienia narzędzia testinner z przekazanym ciągiem takim jak „abc”, ponieważ jego parametr powinien spowodować skopiowanie klasy funkcji „test” do pliku o nazwie „abc” OK.
Ale gdy spróbujesz uruchomić narzędzie testouter z dwoma ciągami, takimi jak „uvw” i „xyz” jako parametrami, narzędzie testinner w testouter.py wydaje się działać raz, ale wysyła ArcMap 10 SP2 na Vista SP2 do poważnego błędu aplikacji, gdy próbuję użyć go po raz drugi.
Ten sam test z użyciem Windows XP SP3 i ArcGIS Desktop 10 SP2 również powoduje poważny błąd aplikacji w tym samym punkcie.
Odpowiedzi:
Oto przykład testu zmodyfikowany w celu zaimportowania modułu „narzędziowego” do głównego skryptu i wywołania funkcji przy użyciu parametrów odczytanych przez narzędzie skryptowe:
CopyFeaturesTool.py - Narzędzie skryptowe, które odczytuje parametry i wywołuje funkcję w innym module
CopyFeaturesUtility.py - Moduł posiadający jedną funkcję
copyFeaturesToTempGDB
. Można go zaimportować lub uruchomić samodzielnie. Jeśli jest uruchamiany autonomicznie, uruchamiany jest kod podif __name__ == '__main__'
.Myślę, że przekonasz się, że to modułowe podejście jest o wiele bardziej wydajne i logiczne, gdy już się przyzwyczaisz. Sekcja Moduły w standardowym samouczku w języku Python jest również dobrym źródłem informacji o tym, jak działa importowanie.
Aby uzyskać przykłady bardziej specyficzne dla Arcpy, spójrz na wbudowane skrypty w twoim
C:\Program Files\ArcGIS\Desktop10.0\ArcToolbox\Scripts
folderze.źródło
Możesz to zrobić, importując moduł (tj. Skrypt) do głównego skryptu i wywołując jego funkcje. Proste demo znajduje się w dwóch dołączonych skryptach.
dla programu głównego i wywoływanych funkcji
musisz tylko upewnić się, że moduł główny i moduł potomny znajdują się w tym samym folderze. Możesz łatwo przekazać parametry do modułu potomnego, a jeśli moduł potomny potrzebuje dostępu do arcpy (zakładając, że używasz wersji 10 arcmap), po prostu przekaż mu odniesienie.
źródło
Importowanie i uruchamianie funkcji to czystszy sposób, aby to zrobić, ale dla zapewnienia kompletności istnieje również
execfile
wbudowana funkcja ( dokumentacja ), która pozwoli ci uruchomić dowolny plik w bieżącym kontekście.źródło
Metoda execfile opisał @JasonScheirer pozwoliło mi zmienić mój kod do dołu i dostarcza rozwiązania mojego problemu z badania:
Może to jednak okazać się kłopotliwe, gdy zastosuje się je do skryptów nie testowych, które są znacznie dłuższe, więc skorzystałem z pracy @ blah238, która poparła podejście @ DanPatterson i wymyśliłem następujący końcowy (testowy) kod, który robi dokładnie to, czego potrzebuję.
i
źródło