Import von Quantum GIS Modulen in unabhängiges Python27

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
busistclaire
User
Beiträge: 3
Registriert: Montag 3. Februar 2014, 10:56

Hallo,
Ich möchte in einem unabhängigen Script auf Module zugreifen, die im Rahmen der Quantum GIS Software bereits installiert sind. Ich benutze Python 2.7 mit Spyder 2.2.7 und Quantum GIS Dufour 2.0.1 unter Windows Vista SP2. Das Script soll nicht mit der in Qgis integrierten Console laufen, sondern in der unabhängigen Python27 Console. Im Speziellen geht es um die Module qgis.core und qgis.utils. Um diese Module zu importieren habe ich bereits folgende Schritte durchgeführt:

Anpassen der Umgebungsvariablen:
Ich habe die PATH-Systemvariable um den Pfad zu meiner Qgis Installation erweitert
C:\Program Files\QGIS Dufour\apps\qgis\bin

und eine neue Benutzervariable PYTHONPATH erstellt die zusätzlich zur Qgis Installation weist.
C:\Program Files\QGIS Dufour\apps\Python27
C:\Program Files\QGIS Dufour\apps
C:\Program Files\QGIS Dufour\apps\qgis

Anpassen des Python-Pfads:
Ich habe in der Qgis Python Console mit sys.path die benötigten Pfade abgefragt und sie in meinem Stand-alone script mit path.append hinzugefügt, beispielsweise folgenden Pfad:

Code: Alles auswählen

import sys
sys.path.append('C:\\Program Files\\QGIS Dufour\\apps\\qgis\\.\\python\\plugins\\processing')
Das Modul qgis.core wird nun vom Qgis Pfad bezogen.

Wenn ich nun qgis.core importieren möchte erscheint folgende Meldung:

Code: Alles auswählen

>>> import qgis.core
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: the sip module implements API v10.0 to v10.1 but the qgis.core module requires API v8.1
Wenn ich das Modul gleich darauf nochmal importiere erscheint keine Fehlermeldung mehr. Kann mir jemand erklären warum sich der API-Fehler so verhält?
Der Import hat aber wahrscheinlich trotzdem nicht korrekt funktioniert wie der nächste Schritt zeigt:

Beim Import des Moduls qgis.utils erscheint folgende Meldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Program Files\QGIS Dufour\apps\qgis\.\python\qgis\utils.py", line 32, in <module>
    from qgis.core import QGis, QgsExpression, QgsMessageLog
ImportError: cannot import name QGis
Das Problem scheint also doch beim import des qgis.core Moduls zu liegen.

Beim importieren der Module mit der in Qgis integrierten Python Console hat alles einwandfrei funktioniert. In Qgis gibt es also keine Kompatibilitätsprobleme der APIs. Somit würde ich vermuten, dass Python27 nicht auf die Qgis-APIs zugreift, sondern auf seine eigenen, die nicht kompatibel sind. Ein Anhängen des Pfads zu den Qgis-APIs mit der oben beschriebenen Methode hat keinen Erfolg gezeigt.
Wie kann ich bewirken, dass Python27 auf die kompatiblen APIs zugreift, oder sollte ich die existierenden APIs upgraden? Liegt es überhaupt an den APIs oder kann ich noch auf andere mögliche Fehlerquellen testen? Vielleicht habt ihr auch Ideen um die Module auf einem anderen Weg zu importieren?

Vielen Dank schonmal
BlackJack

@busistclaire: Als allererstes sollte man die Frage klären ob man die QGis-Module *überhaupt* ausserhalb der Quantum GIS Software importieren und verwenden kann oder ob die nur dafür gedacht/geeignet sind Python in diese Software einzubetten. Nicht das man viel Arbeit in etwas steckt was am Ende sowieso nie hätte funktionieren können.

Die Fehlermeldung würde ich dahingehend interpretieren das irgendwo im Pfad ein `sip`-Modul existiert dessen Version nicht zu `qgis.core passt. An der Stelle könntest Du mal statt `sys.path.append()` die `insert()`-Methode benutzen und die zusätzlichen Pfade vorne in die Liste einfügen damit dort als erstes nach Modulen gesucht wird.
busistclaire
User
Beiträge: 3
Registriert: Montag 3. Februar 2014, 10:56

Danke für deine Antwort BlackJack.

Habe die insert()-Methode getestet und es zeigt sich kein Unterschied zur append()-Methode.
BlackJack hat geschrieben:ob man die QGis-Module *überhaupt* ausserhalb der Quantum GIS Software importieren und verwenden kann oder ob die nur dafür gedacht/geeignet sind Python in diese Software einzubetten.
Ich habe bereits verschiedene andere Qgis Module problemlos importieren und verwenden können wie zum Beispiel Numpy, Scipy und PIL. Bei diesen Modulen macht es offensichtlich keinen Unterschied ob ich sie extern installiere, oder ob ich einfach über den Qgis-Pfad Zugriff habe. Die verfügbaren Module liegen alle im Ordner C:\Program Files\QGIS Dufour\apps\Python27\Lib\site-packages.
Das qgis.core Modul scheint sich aber von diesen zu unterscheiden da es kein Site Package ist, sondern direkt auf Qgis-eigene Funktionen zugreift (z.B. Hinzufügen und Darstellen eines Layers). Ob er externe Zugriff auf die Steuerung der Qgis Software gedacht ist muss ich nun noch herausfinden.
BlackJack

@busistclaire: Was wird denn jeweils in der QGIS-Python-Shell und in der unabhängigen Python-Shell (nach dem hinzufügen der Pfade) ausgegeben wenn Du folgendes ausführst:

Code: Alles auswählen

import sip
print sip
print sip.__file__
Damit sollte man feststellen können ob beide nun das gleiche `sip`-Modul verwenden, beziehungsweise welches von QGIS verwendet wird und wo das gespeichert ist.
busistclaire
User
Beiträge: 3
Registriert: Montag 3. Februar 2014, 10:56

@BlackJack
Wie erwartet werden zwei unterschiedliche Modulpfade verwendet.
1. QGIS-Python-Shell: <module 'sip' from 'C:\Program Files\QGIS Dufour\apps\Python27\lib\site-packages\sip.pyd'>
2. unabhängigen Python-Shell: <module 'sip' from 'C:\Program Files\Python27\lib\site-packages\sip.pyd'>

Habe nun nochmals sichergestellt, dass der Pfad zum Qgis sip-Modul zuerst abgefragt wird. Bei erneutem Überprüfen des Pfads zum sip-Modul wird immernoch Pfad 2 verwendet.
Antworten