Ich bin festgefahren, um herauszufinden, wie Sextante von einer eigenständigen Python aus der OSGeo4W-Distribution ausgeführt werden kann. Der Grund, warum ich dies tun möchte, ist, dass ich jedes Mal, wenn ich ein Modell aus Model Builder testen möchte, müde geworden bin, Parameter in den Dialog einzugeben.
Also hier ist das Python-Skript, nennen wir es test.py
# as per http://qgis.org/pyqgis-cookbook/intro.html#using-pyqgis-in-custom-application
from qgis.core import *
# supply path to where is your qgis installed
QgsApplication.setPrefixPath("C:/OSGeo4W/apps/qgis", True)
# load providers
QgsApplication.initQgis()
from sextante.core.Sextante import Sextante
Sextante.alglist()
Sextante.alghelp("saga:slopeaspectcurvature")
Das rufe ich aus meiner Batch-Datei an
@echo off
set OSGEO4W_ROOT=C:\OSGeo4W
set PYTHONPATH=%OSGEO4W_ROOT%\apps\qgis\python;%OSGEO4W_ROOT%\apps\qgis\python\plugins;%HOME%/.qgis/python/plugins
set PATH=%OSGEO4W_ROOT%\bin;%OSGEO4W_ROOT%\apps\qgis\bin;%OSGEO4W_ROOT%\apps\qgis\plugins
python test.py
Das Problem ist, dass es heißt, Algorithm not found
während ich eine aussagekräftige Ausgabe von der QGIS-Python-Konsole erhalte.
Ich habe das Gefühl, dass mir etwas fehlt, um etwas zu initialisieren. Aber was?
Gibt es eine bessere Möglichkeit, ein Modell zu testen, als Tonnen von Parametern über die GUI einzugeben?
UPDATE 02.07.2012
Ich suche nach einer generischen Python-Lösung zum Testen mit "meinen" Algorithmen. Der oben genannte Algorithmus ist nur ein Beispiel dafür, dass wahrscheinlich etwas nicht initialisiert wurde.
UPDATE 27.07.2012
Eine Alternative zu Script Runner ist die Verwendung der IPython-Konsole zum Debuggen von Skripten. Abgesehen davon scheint es keine Möglichkeit zu geben, einfache Unit-Tests mit Sextante durchzuführen, ohne dass etwas anderes ausgeführt wird :(
UPDATE 30.07.2012
Wie Victor Olaya vorschlägt, versuche ich, Sextante wie im folgenden Code zu initialisieren.
#!/usr/bin/env python
import sys
from PyQt4.QtGui import QApplication
from sextante.core.Sextante import Sextante
def main():
""" main function or something """
# as per http://qgis.org/pyqgis-cookbook/intro.html#using-pyqgis-in-custom-application
from qgis.core import *
import qgis.utils
app = QApplication(sys.argv)
# supply path to where is your qgis installed
QgsApplication.setPrefixPath("C:/OSGeo4W/apps/qgis", True)
# load providers
QgsApplication.initQgis()
# how???
# qgis.utils.iface = QgisInterface.instance()
Sextante.initialize()
run_script(qgis.utils.iface)
def run_script(iface):
""" this shall be called from Script Runner"""
Sextante.alglist()
Sextante.alghelp("saga:slopeaspectcurvature")
if __name__=="__main__":
main()
Allerdings bekomme ich so etwas wie
Traceback (most recent call last):
File "test.py", line 29, in
main()
File "test.py", line 20, in main
Sextante.initialize()
File "C:\Documents and Settings\user\.qgis\python\plugins\sextante\core\Sextante.py", line 94, in initialize
Sextante.addProvider(GrassAlgorithmProvider())
File "C:\Documents and Settings\user\.qgis\python\plugins\sextante\grass\GrassAlgorithmProvider.py", lin
e 17, in __init__
self.actions.append(DefineGrassRegionAction())
File "C:\Documents and Settings\user\.qgis\python\plugins\sextante\grass\DefineGrassRegionAction.py", li
ne 16, in __init__
canvas = QGisLayers.iface.mapCanvas()
AttributeError: 'NoneType' object has no attribute 'mapCanvas'
Nun ... alles wird zu einer Mailinglistendiskussion. Vielleicht lohnt es sich, zu qgis-user oder qgis-developer anstelle von SE zu wechseln.
iface
in einem eigenständigen QGIS-Skript nicht darauf zugreifen .iface
ist nur nützlich, wenn Sie in Side QGIS ausgeführt werden.