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é.Réponses:
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):
la source
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.def run_script(iface)
fonction? Votre script ne s'exécutera pas dans Script Runner sans cela.__import__
portée peut être limitée au lieu de regarder partoutsys.path
. Il montre la docstring et la liste des autres fonctions.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.
la source
Pour les nouveaux utilisateurs lisant cet article, il existe un moyen d'exécuter des algorithmes de traitement QGIS dans des scripts PyQGIS autonomes. Vérifiez les réponses à l' erreur d'importation pour qgis.core lors de l'exécution du script shell OSGeo4w et comment puis-je accéder au `traitement` avec Python? , qui vous fournissent des exemples testés.
la source
É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:
la source
Selon Comment exécuter un simple script python pour QGIS de l'extérieur (par exemple Sublime Text)? vous ne pouvez pas obtenir une référence à l'
iface
objet ici car il n'existe pas dans ce contexte car il est exécuté en dehors de QGIS. Aucun progrès?la source