Come eseguire un semplice script Python per QGIS dall'esterno (ad esempio Sublime Text)?


37

Vorrei eseguire alcuni script Python piccoli e semplici per QGIS (Mac) dall'esterno di QGIS. Con esterno intendo in questo contesto, o la normale riga di comando os (terminal.app) o anche meglio, direttamente da Sublime Text (editor di testo), ma sicuramente non tramite la console integrata Python QGIS.

Ho letto vari tutorial, ad es. Http://www.qgis.org/pyqgis-cookbook/intro.html#python-applications e sono in grado di ottenere un riferimento all'app QGIS, ma sfortunatamente no qgis.utils.ifaceo qualcos'altro di più profondo . Questo piccolo frammento di codice dovrebbe ad esempio stampare il nome del livello attivo ... ecco cosa ho:

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

Per favore non rispondermi ora come creare un plugin o qualcos'altro di "pesante". Sto solo cercando un modo semplice e veloce per girare gli script da un comodo editor di testi a QGIS.

Risposte:


32

Non è possibile ottenere un riferimento ifaceall'oggetto qui perché non esiste in questo contesto. L' oggetto iface( QgisInterface) è un oggetto pratico per i plugin, o script in esecuzione all'interno di QGIS, per accedere agli oggetti principali, ad esempio l'area della mappa, la legenda, il compositore, ecc. Ed esiste solo quando l'applicazione principale è in esecuzione.

Quando crei uno script Python autonomo utilizzando le API QGIS, nulla di tutto ciò esiste perché stai creando la tua applicazione di mapping.

Esistono tre diverse situazioni:

  1. Un plugin QGIS
  2. Uno script che viene eseguito all'interno di QGIS (non un plug-in) per l'automazione
  3. App standalone che utilizza le API QGIS

1.e 2.avere accesso iface, l'ultimo no.

Perché 3se vuoi creare uno script che apre un livello in un'area della mappa, lo faresti dopoQgsApplication.initQgis()

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

Tuttavia, se stai davvero cercando qualcosa di simile 2, puoi semplicemente scrivere questo nel tuo editor di script

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

qgis.utils.iface.activeLayer()

ma questo deve essere eseguito all'interno di QGIS per qgis.utilsfunzionare. Questo può essere fatto inserendo lo script PATHed eseguendolo import scriptnamenella console di Python o usando il plugin ScriptRunner.

Nota quanto segue non è ancora QGIS

C'è un numero 4che non è stato ancora aggiunto, e si spera lo sarà in futuro, e questa è l'opzione per eseguire QGIS con un arg della riga di comando per dire eseguire questo codice.

Per esempio:

qgis --code=mycodefile.py

Registrazione plug-in (versione 1.8)

È possibile utilizzare la classe QgsMessageLog per registrare le informazioni nella finestra del registro QGIS. Il punto esclamativo giallo nell'angolo in basso a destra.

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

o senza usare lambda

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

Preferisco quello basato su lambda in quanto è più breve e meno digitante ogni volta che si desidera registrare qualcosa.


Grazie per chiarimenti e la risposta rapida! quindi aspetto disperatamente l'opzione 4. Nel frattempo devo convivere 2, il che è davvero un dolore fare tutto il tempo import scriptseguito reload(script)e ovviamente passare dal mio editore a QGIS. Ho anche controllato il plugin scriptrunner, il che è promettente, ma poi non sono stato in grado di ottenerne nessuno print "debug value"sulla console QGIS. Sai, per caso, come fare in modo che uno script scriptrunner stia stampando qualcosa sulla console QGIS? Grazie molto! Aspetterò la tua risposta e poi chiuderò la domanda!
Benedikt Groß,

La console python non è pensata per quel tipo di output, più solo per l'input. Quello che puoi fare è accedere alla finestra di registro di QGIS. Aggiungerò alla risposta per spiegare questo.
Nathan W,

Grazie! è estremamente utile. la mia soluzione era quella di abusare di un popup per avere un risultato di debugdef info(text): QMessageBox.information(None,"Debug Info", str(text))
Benedikt Groß,

errore di battitura:QgsVector_y_Layer
Nick Volynkin,

14

Penso che la risposta di Nathan W non sia aggiornata. Sono stato in grado di eseguire script Python QGIS (versione 2.6) dalla riga di comando (opzione 4 di Nathan) utilizzando i seguenti comandi.

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

Funziona ma solo dopo aver chiuso la finestra "suggerimenti" ... c'è un modo per disabilitare totalmente l'interfaccia ed eseguire lo --codescript python?
Anthony O.

5

Aggiornamento per l'opzione 4 di Nathan: (Windows, QGIS 2.18 Las Palmas)

Per stampare il documento di aiuto di QGIS,

qgis: aiuto

Per aprire QGIS, caricare un progetto, quindi eseguire uno script Python.

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

Questi comandi dovrebbero essere eseguiti su OSGeo4W Shell senza problemi.


1
La mia risposta è ancora valida per QGIS 3.8 (Zanzibar).
Swatchai,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.