Comment exécuter un script python simple pour QGIS depuis l'extérieur (par exemple, Sublime Text)?

37

J'aimerais exécuter quelques scripts python simples et petits pour QGIS (Mac) à partir de "l'extérieur" de QGIS. Par extérieur, je veux dire dans ce contexte, soit la ligne de commande os normale (terminal.app), soit même mieux, directement à partir de Sublime Text (éditeur de texte), mais certainement pas via la console python QGIS intégrée.

J'ai lu divers tutoriels, par exemple http://www.qgis.org/pyqgis-cookbook/intro.html#python-applications et je peux obtenir une référence à l'application QGIS, mais malheureusement pas à qgis.utils.ifacequelque chose de plus profond . Ce petit extrait de code devrait par exemple afficher le nom du calque actif ... Voici ce que j'ai:

    import sys
    sys.path.append("/Applications/QGIS.app/Contents/Resources/python")

    from qgis.core import *
    import qgis.utils

    print "helo" # console output: helo

    QgsApplication.setPrefixPath("/Applications/QGIS.app/", True)
    QgsApplication.initQgis()

    print QgsApplication # console output: <class 'qgis.core.QgsApplication'>

    print qgis.utils.iface # = console output: none

    aLayer = qgis.utils.iface.activeLayer()
    print aLayer.name()

    QgsApplication.exitQgis()

S'il vous plaît ne me répondez pas maintenant comment créer un plugin ou quelque chose d'autre "lourd". Je cherche simplement un moyen rapide et facile de créer des scripts dans un éditeur de texte confortable pour QGIS.

Benedikt Groß
la source

Réponses:

32

Vous ne pouvez pas obtenir une référence à l' ifaceobjet ici car il n'existe pas dans ce contexte. L' objet iface( QgisInterface) est un objet de commodité permettant aux plug-ins ou aux scripts s'exécutant dans QGIS d'accéder aux objets principaux, par exemple le fond de carte, la légende, le compositeur, etc., et n'existe que lorsque l'application principale est en cours d'exécution.

Lorsque vous créez un script Python autonome à l'aide des API QGIS, rien de tout cela n'existe car vous créez votre propre application de mappage.

Il y a trois situations différentes:

  1. Un plugin QGIS
  2. Un script qui s'exécute dans QGIS (pas un plugin) pour l'automatisation
  3. Application autonome utilisant les API QGIS

1.et 2.avoir accès à iface, le dernier ne le fait pas.

Car 3si vous voulez créer un script qui ouvre une couche dans un canevas de carte, vous ferez cela aprèsQgsApplication.initQgis()

map = QgsMapCanavs()
layer = QgsVectoryLayer('path.shp','myshapefile','ogr')
map.setLayerSet([layer])

Cependant, si vous cherchez vraiment quelque chose comme ça, 2vous pouvez simplement l'écrire dans votre éditeur de script.

from qgis.core import *
from qgis.gui import *
import qgis.utils

qgis.utils.iface.activeLayer()

mais cela doit être exécuté dans QGIS pour qgis.utilsfonctionner. Cela peut être fait en plaçant le script PATHet en l'exécutant import scriptnamedans la console Python ou en utilisant le plugin ScriptRunner.

Notez que ce qui suit n'est pas encore QGIS

Un numéro 4n'a pas encore été ajouté et, espérons-le, à l'avenir, c'est l'option permettant d'exécuter QGIS avec un argument en ligne de commande permettant d'exécuter ce code.

Par exemple:

qgis --code=mycodefile.py

Enregistrement du plugin (version 1.8)

Vous pouvez utiliser la classe QgsMessageLog pour consigner des informations dans la fenêtre de journal QGIS. Le point d'exclamation jaune dans le coin inférieur droit.

from qgis.core import *
log = lambda m: QgsMessageLog.logMessage(m,'My Plugin') 
log('My message')

ou sans utiliser lambda

QgsMessageLog.logMessage('My message', 'My Plugin')

Je préfère celui basé sur Lambda, car il est plus court et dactylographie moins lorsque vous souhaitez enregistrer quelque chose.

Nathan W
la source
Merci pour la clarification et la réponse rapide! alors j'attends désespérément l'option 4. En attendant, je dois vivre avec 2, ce qui est vraiment pénible à import scriptsuivre, suivi reload(script)et bien entendu de mon éditeur à QGIS. J'ai également vérifié le plugin scriptrunner, ce qui est prometteur, mais je n'ai pas réussi à en obtenir print "debug value"dans la console QGIS. Savez-vous, par hasard, comment faire en sorte qu'un script scriptrunner imprime quelque chose sur la console QGIS? Merci beaucoup! Attendra votre réponse et puis fermez la question!
Benedikt Groß
La console python n'est pas vraiment destinée à ce type de sortie, mais uniquement à une entrée. Ce que vous pouvez faire est de vous connecter à la fenêtre de journal QGIS. Ajoutera à la réponse pour expliquer cela.
Nathan W
Merci! c'est extrêmement utile. ma solution était d'abuser d'un popup pour avoir une sortie de débogagedef info(text): QMessageBox.information(None,"Debug Info", str(text))
Benedikt Groß
faute de frappe:QgsVector_y_Layer
Nick Volynkin
14

Je pense que la réponse de Nathan W est obsolète. J'ai été en mesure d'exécuter des scripts python QGIS (version 2.6) à partir de la ligne de commande (option 4 de Nathan) à l'aide des commandes suivantes.

man qgis
qgis -nologo --project /path/foo.qgs --code /path/foo.py
jsta
la source
Cela fonctionne mais seulement après avoir fermé la fenêtre "astuces" ... existe-t-il un moyen de désactiver totalement l'interface et d'exécuter simplement le --codescript python?
Anthony O.
5

Mise à jour pour l'option 4 de Nathan: (Windows, QGIS 2.18 Las Palmas)

Pour imprimer le document d’aide QGIS,

qgis --help

Pour ouvrir QGIS, chargez un projet, puis exécutez un script python.

qgis --nologo --project c: /path/to/projfile.qgs --code c: /path/to/code.py

Ces commandes devraient fonctionner sur OSGeo4W Shell sans problèmes.

swatchai
la source
1
Ma réponse est toujours valable pour QGIS 3.8 (Zanzibar).
Swatchai