Ich hatte letzte Woche eine Frage zum Anpassen einer ToolValidator-Klasse gestellt und einige sehr gute Antworten erhalten. Bei der Arbeit mit den vorgeschlagenen Lösungen habe ich ein benutzerdefiniertes Modul erstellt, das Abfragen für eine Datenbank ausführt und sowohl von der ToolValidator-Klasse (um Werte für die Dropdown-Listen bereitzustellen) als auch später im Geoverarbeitungsskript (um andere zu erhalten) aufgerufen wird Parameter basierend auf Elementen, die in Dropdown-Listen ausgewählt wurden). Ich kann das benutzerdefinierte Modul in der ToolValidator-Klasse jedoch nicht aufrufen. Ich habe versucht, ohne Glück an den Pfad anzuhängen. Wenn ich versuche, diese Änderungen auf das Skript anzuwenden, wird ein Laufzeitfehler angezeigt: [Errno 9] Ungültiger Dateideskriptor. Wenn ich die Importzeile auskommentiere, keine Fehler.
sys.path.append('my_custom_module_directory')
import my_custom_module
Viele von Ihnen fragen sich vielleicht, warum ich nicht einfach ein benutzerdefiniertes Tool mit ArcObjects implementiere. Der Grund dafür ist, dass meine Endbenutzer nicht über die erforderlichen Berechtigungen verfügen, um DLLs auf ihrem Computer zu registrieren.
UPDATE: Dies ist mir in ArcGIS 10 passiert. Interessanterweise habe ich zunächst den Pfad innerhalb der Funktion initialiazeParameters der ToolValidator-Klasse angehängt. Wenn ich das Anhängen außerhalb (dh über) der ToolValidator-Klasse durchführe, funktioniert alles wie erwartet.
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()
UPDATE 2: Ich glaube, ich habe die wahre Ursache meines Problems gefunden. In den Codefragmenten in diesem Beitrag habe ich scheinbar echte Pfade (z. B. C: / Working / SomeFolder) an den sys.path angehängt. In meiner eigentlichen ToolValidator-Klasse habe ich einen relativen Pfad mit os.path.dirname(__file__)
+ "\ my_special_folder ..." erstellt. Ich hatte erwartet, dass os.path.dirname(__file__)
dies den Pfad der Toolbox zurückgeben würde, da dieser die ToolValidator-Klasse enthält. Ich habe festgestellt, dass dies nicht der Fall ist. Soweit ich das beurteilen kann, wird die ToolValidator-Klasse niemals in eine .py-Datei geschrieben, und ich spekuliere, dass dieser Code an den Python-Interpreter im Speicher übergeben wird, also __file__
nutzlos ist oder ein temporäres Skript beibehalten und dann ausgeführt wird ( path_to_script) wird aufgerufen und erneut gerendert__file__
nutzlos. Ich bin sicher, es gibt noch andere Gründe, die mir fehlen.
Kurz gesagt, wenn ich einen fest codierten Pfad verwende, funktioniert sys.append überall, relative Pfade funktionieren in der ToolValidator-Klasse nicht so gut.