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.Antworten:
Sie können Ihr Skript so erstellen, dass es mit dem Script Runner-Plugin von Gary Sherman funktioniert, und es in QGIS ausführen. Wenn Sie das Skript nach der Bearbeitung erneut ausführen, sollte Script Runner aufgefordert werden, das Modul neu zu laden und Ihre Änderungen wiederzugeben. Siehe auch: Plugins.qgis.org von Script Runner .
Das Wesentliche ist, sicherzustellen, dass Sie eine run_script-Funktion haben, die von Script Runner aufgerufen wird (Beispiel aus seinem Blog):
quelle
AttributeError: 'module' object has no attribute 'run_script'
und darauf bestanden, dass ich keine Dokumentzeichenfolgen habe, die ich im Quell-Viewer sehen kann.def run_script(iface)
Funktion hinzugefügt ? Ihr Skript wird ohne das nicht in Script Runner ausgeführt.__import__
Umfang eingeschränkt werden könnte, anstatt überall hinzuschauensys.path
. Es zeigt die Dokumentzeichenfolge und eine Liste anderer Funktionen.Sextante muss initialisiert werden, damit die Algorithmen geladen und später ausgeführt werden können.
Rufen Sie Sextante.initialize () auf, bevor Sie etwas tun.
quelle
Für neue Benutzer, die diesen Beitrag lesen, gibt es eine Möglichkeit, QGIS-Verarbeitungsalgorithmen in eigenständigen PyQGIS-Skripten auszuführen. Überprüfen Sie die Antworten auf den Importfehler für qgis.core, wenn Sie das OSGeo4w-Shell-Skript ausführen, und wie kann ich mit Python auf "Verarbeitung" zugreifen? , die Ihnen getestete Beispiele liefern.
quelle
Da der Algorithmus, den Sie verwenden möchten, Teil der Saga ist, können Sie die Saga direkt verwenden.
zB aus einer Batchdatei:
quelle
Laut Ausführen eines einfachen Python-Skripts für QGIS von außen (z. B. Sublime Text)? Sie können hier keinen Verweis auf das
iface
Objekt erhalten, da es in diesem Kontext nicht vorhanden ist, da es außerhalb von QGIS ausgeführt wird. Irgendein Fortschritt?quelle