Kategorien

Python, COM und ArcObjects

Mit Version 9.1 von ArcGIS gibt es ja die Möglichkeit, Geoprocessing-Scripts mit Python zu schreiben. Dabei greift man mit Python (mit dem win32com-Modul) auf das Geoprocessing-Objekt zu, das — wie alle ArcObjects — ein COM-Objekt ist. Ich habe mir nun die Frage gestellt, ob man nun mit Python nun auch auf die anderen ArcObjects zugreifen kann. Mit Programmiersprachen wie VB, C++ funktioniert das ja problemlos. Die Antwort ist ein Nein mit einem kleinen Aber…

Mit Hilfe des win32com-Moduls kann Python ohne Probleme und sehr komfortabel auf COM-Objekte zugreifen. Der Haken an der Sache ist einfach, dass mit dieser Methode nur auf COM-Objekte zugegriffen werden kann, die das IDispatch-Interface implementieren. Ist dies nicht der Fall, klappt der Zugriff nicht. Der Zugriff über das IDispatch-Interface kann variabel gestaltet werden und entweder als ‘early binding‘ oder als ‘late binding‘ erfolgen. Tatsache ist, dass das Geoprocessing-Objekt von ArcObjects dieses IDispatch-Interface implementiert. Damit ist es möglich mit Python auf dieses Objekt zuzugreifen:

gp = win32com.client.Dispatch("esriGeoprocessing.GpDispatch.1")

Es gibt aber nur wenig andere ArcObjects, die dieses Interface ebenfalls implementieren. Eine Übersicht über diese Objekte kann man sich verschaffen, wenn man in den Objektmodellen ganz einfach nach ‘IDispatch’ sucht. Es sind dies nicht genug, um damit eine einigermassen komplexe Applikation entwickeln zu können. In Python gibt es neben dem IDispatch-Interface noch andere Zugriffsmöglichkeiten auf COM-Objekte sogenannte ‘native Interfaces’. Python kann aber damit nicht auf beliebige Objekte zugreifen, sondern nur auf solche, für die eine bestimmte Erweiterung d.h. ein Modul existiert. Für ArcObjects war eine solche Erweiterung einmal in Entwicklung (PyArcObjects), aber sie ist im Moment auf Eis gelegt.

Kurz gesagt: der beliebige Zugriff auf ArcObjects via COM gelingt z.Zt. mit Programmiersprachen wie VBA, VB, C++, VB.Net, C# etc. Ein möglicher Umweg wäre via .NET. Es gibt für Python mindestens zwei Implementationen (IronPython, Python for .NET), die eine enge Verzahnung mit der .NET-Technologie anstreben. Da die ArcObjects ja auch via .NET angesprochen werden können, bestünde hier vielleicht eine Möglichkeit. Problematisch ist allerdings die Tatsache, dass in ArcGIS 9.1 nur Python 2.1 installiert ist.

Ohne Probleme möglich ist die Erzeugung eines COM-Servers in Python. Win32com bietet hier alle notwendigen Werkzeuge (inkl. Systemregistrierung) um eigene COM-Objekte in Python entwickeln zu können. Dies ist sicherlich eine valable Möglichkeit, um das Hindernis der fehlenden Entwicklungsumgebung auf unserem GIS-Server zu umgehen.

Weitere Dokumente zum Thema Python und COM:

Leave a Reply

  

  

  

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>