¿Cómo ejecutar un script python simple para QGIS desde el exterior (por ejemplo, Sublime Text)?

37

Me gustaría ejecutar algunos scripts python pequeños y simples para QGIS (Mac) desde "fuera" de QGIS. Con afuera quiero decir en este contexto, ya sea la línea de comando normal del sistema operativo (terminal.app) o incluso mejor, directamente desde Sublime Text (editor de texto), pero definitivamente no a través de la consola QGIS python incorporada.

He leído varios tutoriales, por ejemplo, http://www.qgis.org/pyqgis-cookbook/intro.html#python-applications y puedo obtener una referencia a la aplicación QGIS, pero desafortunadamente no lo hago qgis.utils.ifaceo algo más profundo . Este pequeño fragmento de código debería, por ejemplo, imprimir el nombre de la capa activa ... esto es lo que tengo:

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

Por favor, no me responda ahora cómo crear un complemento u otra cosa "pesada". Solo estoy buscando una manera rápida y fácil de grabar scripts de un cómodo editor de texto para QGIS.

Benedikt Groß
fuente

Respuestas:

32

No puede obtener una referencia al ifaceobjeto aquí porque no existe en este contexto. El objeto iface( QgisInterface) es un objeto conveniente para complementos o scripts que se ejecutan dentro de QGIS, para acceder a los objetos principales, por ejemplo, el lienzo del mapa, la leyenda, el compositor, etc., y solo existe cuando la aplicación principal se está ejecutando.

Cuando crea una secuencia de comandos Python independiente utilizando las API de QGIS, nada de esto existe porque está creando su propia aplicación de mapeo.

Hay tres situaciones diferentes:

  1. Un complemento QGIS
  2. Un script que se ejecuta dentro de QGIS (no un complemento) para la automatización
  3. Aplicación independiente que usa API QGIS

1.y 2.tener acceso a iface, el último no.

Por 3si desea crear un script que abre una capa en una vista del mapa que haría esto después deQgsApplication.initQgis()

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

Sin embargo, si realmente está buscando algo así 2, simplemente puede escribir esto en su editor de scripts

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

qgis.utils.iface.activeLayer()

pero esto tiene que ejecutarse dentro de QGIS para qgis.utilsque funcione. Eso se puede hacer poniendo el script PATHy ejecutándolo import scriptnameen la consola de Python o usando el complemento ScriptRunner.

Tenga en cuenta que lo siguiente aún no es QGIS

Hay un número 4que aún no se ha agregado, y con suerte lo será en el futuro, y esa es la opción de ejecutar QGIS con un argumento de línea de comando para decir ejecutar este código.

Por ejemplo:

qgis --code=mycodefile.py

Registro de complementos (versión 1.8)

Puede usar la clase QgsMessageLog para registrar información en la ventana de registro de QGIS. El signo de exclamación amarillo en la esquina inferior derecha.

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

o sin usar lambda

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

Prefiero el basado en lambda, ya que es más corto y escribe menos cada vez que desea registrar algo.

Nathan W
fuente
Gracias por la aclaración y la rápida respuesta! entonces estoy esperando desesperadamente la opción 4. Mientras tanto, tengo que convivir 2, lo cual es realmente doloroso hacerlo todo el tiempo import scriptseguido reload(script)y, por supuesto, cambiar de mi editor a QGIS. También revisé el complemento scriptrunner, que es prometedor, pero luego no pude acceder print "debug value"a la consola QGIS. ¿Sabes, por casualidad, una forma de hacer que un script de scriptrunner imprima algo en la consola QGIS? ¡Muchas gracias! ¡Esperará su respuesta y luego cerrará la pregunta!
Benedikt Groß
La consola de Python no está realmente destinada a ese tipo de salida, más que solo para entrada. Lo que puede hacer es iniciar sesión en la ventana de registro de QGIS. Agregará a la respuesta para explicar esto.
Nathan W
¡Gracias! Eso es extremadamente útil. mi solución era abusar de una ventana emergente para tener una salida de depuracióndef info(text): QMessageBox.information(None,"Debug Info", str(text))
Benedikt Groß
error tipográfico:QgsVector_y_Layer
Nick Volynkin
14

Creo que la respuesta de Nathan W está desactualizada. Pude ejecutar scripts de Python QGIS (versión 2.6) desde la línea de comandos (opción 4 de Nathan) usando los siguientes comandos.

man qgis
qgis -nologo --project /path/foo.qgs --code /path/foo.py
jsta
fuente
Esto funciona, pero solo después de cerrar la ventana de "consejos" ... ¿hay alguna forma de deshabilitar la interfaz totalmente y simplemente ejecutar el --codescript de Python?
Anthony O.
5

Actualización para la opción 4 de Nathan: (Windows, QGIS 2.18 Las Palmas)

Para imprimir el documento de ayuda de QGIS,

qgis --help

Para abrir QGIS, cargue un proyecto y luego ejecute un script de Python.

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

Estos comandos deben ejecutarse en OSGeo4W Shell sin problemas.

swatchai
fuente
1
Mi respuesta sigue siendo válida para QGIS 3.8 (Zanzibar).
Swatchai