Comment exécuter des algorithmes sextante en dehors de la console python QGIS?

10

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 foundalors 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.

mlt
la source
Vous ne pouvez pas accéder ifacedans un script QGIS autonome. ifaceest uniquement utile lors de l'exécution dans QGIS côté.
Nathan W

Réponses:

5

Vous pouvez créer votre script pour qu'il fonctionne avec le plugin Script Runner de Gary Sherman et l'exécuter à partir de QGIS. La réexécution du script, après modification, devrait inviter Script Runner à recharger le module et à refléter vos modifications. Voir aussi: Liste des plugins.qgis.org de Script Runner .

L'essentiel est de vous assurer que vous disposez d'une fonction run_script, qui est appelée par Script Runner (exemple de son blog):

def run_script(iface):
    ldr = Loader(iface)
    ldr.load_shapefiles('/vmap0_shapefiles')
dakcarto
la source
Bien qu'en théorie, cela devrait en effet aider au débogage (bien que dans QGIS), il semble qu'il soit cassé sous Windows. Il ne cesse de AttributeError: 'module' object has no attribute 'run_script'répéter et d'insister sur le fait que je n'ai pas de docstrings que je puisse voir dans la visionneuse source.
mlt
Avez-vous ajouté la def run_script(iface)fonction? Votre script ne s'exécutera pas dans Script Runner sans cela.
dakcarto
Apparemment, il ne faut pas nommer le script comme test :-) mytest fonctionne bien jusqu'à présent. Ce serait bien si la __import__portée peut être limitée au lieu de regarder partout sys.path. Il montre la docstring et la liste des autres fonctions.
mlt
Script Runner est mis à jour ici
Dave X
4

Sextante doit être initialisé, il charge donc les algorithmes et peut ensuite les exécuter.

Appelez Sextante.initialize () avant de faire quoi que ce soit.

Victor Olaya
la source
Salut Victor, est-ce toujours le cas? Je n'arrive pas à appeler Sextante dans un script autonome (en dehors de QGIS) et à trouver tous les exemples sur lesquels Google ne fonctionne pas. Cela a été posté il y a un an donc je me demande si l'architecture de sextante a changé?
Rich
2

Étant donné que l'algorithme que vous souhaitez utiliser fait partie de la saga, vous pouvez utiliser la saga directement.

par exemple à partir d'un fichier batch:

@ECHO OFF

REM SET SAGA_MLB = C:\SAGA\Modules
REM SET PATH = %PATH%;C:\SAGA

saga_cmd ta_morphometry "Slope, Aspect, Curvature" -ELEVATION=elevation.sgrd -SLOPE=slope.sgrd -ASPECT=aspect.sgrd -CURV=NULL -HCURV=NULL -VCURV=NULL -METHOD=5

PAUSE
johanvdw
la source
Je m'excuse, j'aurais dû être clair. C'était juste un exemple. Je ne vais pas utiliser SAGA en particulier.
mlt