Je suis un peu coincé à essayer de trouver le moyen d'exécuter sextante à partir d'un python autonome de la distribution OSGeo4W. La raison pour laquelle je veux le faire est que je suis fatigué de saisir des paramètres dans la boîte de dialogue chaque fois que je veux tester un modèle à partir de Model Builder.
Voici donc le script python appelons-le 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")
Que j'appelle depuis mon fichier 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
Le problème est qu'il dit Algorithm not found
alors que j'obtiens une sortie significative de la console python QGIS.
J'ai l'impression de manquer pour initialiser quelque chose. Mais quoi?
Existe-t-il une meilleure façon de tester un modèle autrement qu'en entrant des tonnes de paramètres à l'aide de l'interface graphique?
MISE À JOUR 7/2/2012
Je recherche une solution pythonique générique à tester avec des algorithmes "mine". L'algorithme susmentionné n'est qu'un exemple montrant que quelque chose n'a probablement pas été initialisé.
MISE À JOUR 7/27/2012
Une alternative à Script Runner consiste à utiliser la console IPython pour déboguer les scripts. En dehors de cela, il ne semble pas y avoir de moyen de faire des tests unitaires simples avec sextante sans autre exécution :(
MISE À JOUR 30/07/2012
Comme Victor Olaya le suggère, j'essaie d'initialiser Sextante comme dans le code ci-dessous.
#!/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()
Mais je reçois quelque chose comme
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'
Eh bien ... tout devient une discussion sur la liste de diffusion. Peut-être que cela vaut la peine de passer à qgis-user ou qgis-developer au lieu de SE.
iface
dans un script QGIS autonome.iface
est uniquement utile lors de l'exécution dans QGIS côté.