Wie starte ich ein einfaches Python-Skript für QGIS von außen (zB Sublime Text)?


37

Ich möchte ein paar kleine und einfache Python-Skripte für QGIS (Mac) von "außerhalb" von QGIS ausführen. Mit außerhalb meine ich in diesem Zusammenhang entweder die normale os-Befehlszeile (terminal.app) oder noch besser, direkt aus Sublime Text (Texteditor), aber definitiv nicht über die eingebaute QGIS-Python-Konsole.

Ich habe verschiedene Tutorials durchgelesen, z. B. http://www.qgis.org/pyqgis-cookbook/intro.html#python-applications, und ich kann einen Verweis auf die QGIS-App erhalten, aber leider nicht auf qgis.utils.ifaceoder etwas anderes Tieferes . Dieses kleine Code-Snippet sollte zum Beispiel den Namen der aktiven Ebene ausdrucken ... hier ist, was ich habe:

    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()

Bitte antworte mir jetzt nicht, wie man ein Plugin oder etwas anderes "Schweres" erstellt. Ich bin nur auf der Suche nach einer schnellen und einfachen Möglichkeit, Skripte aus einem komfortablen Texteditor in QGIS zu erstellen.

Antworten:


32

Sie können hier keinen Verweis auf das ifaceObjekt erhalten, da es in diesem Kontext nicht vorhanden ist. Das Objekt iface( QgisInterface) ist ein komfortables Objekt für Plugins oder Skripte, die in QGIS ausgeführt werden, um auf die Hauptobjekte, z. B. den Kartenbereich, die Legende, den Komponisten usw., zuzugreifen. Es ist nur verfügbar, wenn die Hauptanwendung ausgeführt wird.

Wenn Sie ein eigenständiges Python-Skript mit den QGIS-APIs erstellen, ist nichts davon vorhanden, da Sie Ihre eigene Kartenanwendung erstellen.

Es gibt drei verschiedene Situationen:

  1. Ein QGIS-Plugin
  2. Ein Skript, das in QGIS (kein Plugin) zur Automatisierung ausgeführt wird
  3. Standalone-App mit QGIS-APIs

1.und 2.haben Zugang zu iface, der letzte nicht.

Für , 3wenn Sie ein Skript erstellen , die eine Schicht in einer Karte öffnet Leinwand Sie dies tun würden , nachdemQgsApplication.initQgis()

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

Wenn Sie jedoch wirklich nach etwas suchen 2, können Sie dies einfach in Ihrem Skripteditor schreiben

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

qgis.utils.iface.activeLayer()

Dies muss jedoch in QGIS ausgeführt werden, damit qgis.utilses funktioniert. Dies kann erreicht werden, indem das Skript in der Python-Konsole gestartet PATHund ausgeführt wird import scriptnameoder indem das ScriptRunner-Plugin verwendet wird.

Beachten Sie, dass das Folgende noch nicht QGIS ist

Es gibt eine Nummer 4, die noch nicht hinzugefügt wurde und die es hoffentlich auch in Zukunft geben wird. Dies ist die Option, QGIS mit einem Befehlszeilenargument auszuführen, um diesen Code auszuführen.

Beispielsweise:

qgis --code=mycodefile.py

Plugin Logging (Version 1.8)

Sie können die QgsMessageLog-Klasse verwenden, um Informationen im QGIS-Protokollfenster zu protokollieren. Das gelbe Ausrufezeichen in der rechten unteren Ecke.

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

oder ohne Lambda

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

Ich bevorzuge das Lambda-basierte, da es kürzer ist und weniger tippt, wenn Sie etwas protokollieren möchten.


Vielen Dank für die Klarstellung und die schnelle Antwort! dann warte ich verzweifelt auf option 4. In der Zwischenzeit muss ich damit leben 2, was wirklich eine Qual ist, import scriptgefolgt von einem reload(script)Wechsel von meinem Editor zu QGIS. Ich habe auch das Scriptrunner-Plugin überprüft, was vielversprechend ist, aber dann konnte ich keine Verbindung print "debug value"zur QGIS-Konsole herstellen. Wissen Sie zufällig, wie ein Scriptrunner-Skript etwas auf der QGIS-Konsole drucken kann? Danke vielmals! Wartet auf deine Antwort und schließt dann die Frage!
Benedikt Groß

Die Python-Konsole ist eigentlich nicht für diese Art von Ausgabe gedacht, sondern nur für die Eingabe. Sie können sich im QGIS-Protokollfenster anmelden. Wird die Antwort ergänzen, um dies zu erklären.
Nathan W

Vielen Dank! das ist extrem hilfreich. Mein Workaround war, ein Popup zu missbrauchen, um eine Debug-Ausgabe zu erhaltendef info(text): QMessageBox.information(None,"Debug Info", str(text))
Benedikt Groß

Tippfehler:QgsVector_y_Layer
Nick Volynkin

14

Ich denke, die Antwort von Nathan W ist veraltet. Ich konnte Python-Skripte für QGIS (Version 2.6) über die Befehlszeile (Nathans Option 4) mit den folgenden Befehlen ausführen.

man qgis
qgis -nologo --project /path/foo.qgs --code /path/foo.py

Dies funktioniert aber erst, nachdem ich das "Tipps" -Fenster geschlossen habe ... gibt es eine Möglichkeit, die Benutzeroberfläche vollständig zu deaktivieren und einfach das --codePython-Skript auszuführen ?
Anthony O.

5

Update für Nathans Option 4: (Windows, QGIS 2.18 Las Palmas)

So drucken Sie das QGIS-Hilfedokument:

qgis --help

Laden Sie zum Öffnen von QGIS ein Projekt und führen Sie dann ein Python-Skript aus.

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

Diese Befehle sollten ohne Probleme auf der OSGeo4W-Shell ausgeführt werden.


1
Meine Antwort ist immer noch gültig für QGIS 3.8 (Zanzibar).
Swatchai
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.