Sono un po 'bloccato cercando di capire come eseguire sestante da un pitone autonomo dalla distribuzione OSGeo4W. Il motivo per cui voglio farlo è che mi sono stancato di inserire i parametri nella finestra di dialogo ogni volta che voglio testare un modello da Model Builder.
Quindi ecco lo script di Python chiamiamolo 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")
Che sto chiamando dal mio file batch
@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
Il problema è che dice Algorithm not found
che ottengo un output significativo dalla console Python di QGIS.
Mi sento come se mi mancasse per inizializzare qualcosa. Ma cosa?
Esiste un modo migliore per testare un modello se non inserendo tonnellate di parametri usando la GUI?
AGGIORNAMENTO DEL 7/2/2012
Sto cercando una soluzione pitonica generica da testare con algoritmi "miei". L'algoritmo sopra menzionato è solo un esempio che mostra che qualcosa probabilmente non è stato inizializzato.
AGGIORNAMENTO 27/07/2012
Un'alternativa a Script Runner è utilizzare la console IPython per eseguire il debug degli script. A parte questo, non sembra esserci un modo per fare semplici test unitari con sestante con nient'altro in esecuzione :(
AGGIORNAMENTO DEL 30/07/2012
Come suggerisce Victor Olaya, provo a inizializzare Sextante come nel codice seguente.
#!/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()
Comunque ottengo qualcosa di simile
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'
Bene ... tutto diventa una discussione sulla mailing list allo stesso modo. Forse vale la pena passare a qgis-user o qgis-developer anziché a SE.
iface
in uno script QGIS autonomo.iface
è utile solo quando si esegue in QGIS laterale.