W zeszłym tygodniu opublikowałem pytanie dotyczące dostosowywania klasy ToolValidator i otrzymałem kilka bardzo dobrych odpowiedzi. Pracując z proponowanymi rozwiązaniami, stworzyłem moduł niestandardowy, który wykonuje zapytania na bazie danych i będzie wywoływany zarówno przez klasę ToolValidator (w celu dostarczenia wartości dla list rozwijanych), jak i później w skrypcie geoprocessingu (aby uzyskać inne parametry oparte na elementach wybranych z list rozwijanych). Nie wydaje mi się jednak, aby mógł wywoływać moduł niestandardowy w klasie ToolValidator. Próbowałem dołączyć do ścieżki bez powodzenia. Gdy próbuję zastosować te zmiany w skrypcie, pojawia się błąd czasu wykonania: [Errno 9] Zły deskryptor pliku. Jeśli skomentuję linię importu, żadnych błędów.
sys.path.append('my_custom_module_directory')
import my_custom_module
Wielu z was może pyta, dlaczego nie zaimplementuję niestandardowego narzędzia za pomocą ArcObjects. Powodem jest to, że moi użytkownicy końcowi nie mają uprawnień niezbędnych do zarejestrowania ŻADNYCH bibliotek DLL na swoim komputerze.
AKTUALIZACJA: Zdarzyło mi się to w ArcGIS 10. Co ciekawe, początkowo dołączałem się do ścieżki wewnątrz funkcji initialiazeParameters klasy ToolValidator. Jeśli wykonam dołączenie poza (tj. Na górze) klasy ToolValidator, wszystko działa zgodnie z oczekiwaniami.
sys.path.append('C:/Working/SomeFolder')
import somescript -------->THIS WORKS
class ToolValidator:
"""Class for validating a tool's parameter values and controlling
the behavior of the tool's dialog."""
def __init__(self):
"""Setup arcpy and the list of tool parameters."""
import arcpy
sys.path.append('C:/Working/SomeFolder')
import somescript -------> THIS DOESNT WORK
self.params = arcpy.GetParameterInfo()
AKTUALIZACJA 2: Myślę, że znalazłem prawdziwą przyczynę mojego problemu. W fragmentach kodu w tym poście dodałem coś, co wydaje się prawdziwymi ścieżkami (np. C: / Working / SomeFolder) do sys.path. W mojej rzeczywistej klasie ToolValidator budowałem ścieżkę względną, używając os.path.dirname(__file__)
+ „\ mój_specjalny_folder ...”. Spodziewałem się, os.path.dirname(__file__)
że zwróci ścieżkę do przybornika, ponieważ zawiera on klasę ToolValidator. Przekonałem się, że tak nie jest. O ile mogę stwierdzić, klasa ToolValidator nigdy nie jest faktycznie zapisywana do pliku .py, i spekuluję, że ten kod jest przekazywany do interpretera python w pamięci, więc __file__
jest bezużyteczny lub jakiś skrypt tymczasowy jest utrwalany, a następnie wykonywalny ( ścieżka_do_skryptu), ponownie renderowane__file__
nieprzydatny. Jestem pewien, że są też inne powody, dla których tęsknię.
Krótko mówiąc, jeśli użyję zakodowanej ścieżki, sys.append działa wszędzie, ścieżki względne nie działają tak dobrze w klasie ToolValidator.