¿Cómo salir de QGIS después de ejecutar un script de Python?

10

Me gustaría ejecutar un script de Python a través de qgis --code myscript.pyy luego salir inmediatamente. Estoy usando iface.actionExit().trigger(), que mata QGIS cuando lo ejecuto desde la consola de Python, pero no cuando pongo el script al que paso --code.

¿Cuál es la forma correcta de salir inmediatamente? Estoy ejecutando QGIS 2.0.1

Actualización : también lo he intentado sys.exit(). QGIS lo detecta y abre una ventana con lo siguiente:

An error occured during execution of following code:
  execfile('myscript.py')

  Traceback (most recent call last):
    File "", line 1, in 
    File "myscript.py", line 14, in 
      sys.exit()
  SystemExit

Actualización : os.kill(os.getpid(), 9)funciona pero es un truco sucio y estoy buscando algo mejor.

Conley Owens
fuente
1
Puedes pero ¿por qué?
Nathan W
1
Estoy haciendo automáticamente un pdf con un compositor de impresión (la --screenshotbandera simplemente no lo corta).
Conley Owens
¿Podría incluir su código en la pregunta, ya que esto podría ayudar a los posibles respondedores? Pregunto esto ya que también utilicé sys.exit()en mis scripts que han funcionado.
Joseph
echo "sys.exit()" > code.py; qgis --code code.py¿Qué versión de QGIS estabas ejecutando? ¿Cómo estabas invocando los guiones?
Conley Owens

Respuestas:

5

Prueba en tu guión:

from qgis.utils import iface

#your code here

iface.actionExit().trigger()

Esto funciona para mi.

Nota de edición:

Basado en el comentario de Conley Owens, cambié ligeramente mi script para hacer "algo útil" (donde se comentó la línea que importaba iface ).

#from qgis.utils import iface
import os

os.system('clear')
print "Hello"

iface.actionExit().trigger()

Corrí qgis --code myscript.py en la consola bash, dentro de la carpeta de la secuencia de comandos, e inmediatamente recibí este mensaje de error:

ingrese la descripción de la imagen aquí

e indicando que desde qgis.utils import iface line es necesario.

Cuando no se comenta la primera línea, la ejecución del script no tuvo errores:

ingrese la descripción de la imagen aquí

pero el control no estaba en la consola de Python; está en la consola bash (observe la impresión "Hola" allí). Por esta razón, su comando os.kill (os.getpid (), 9) funciona porque cierra la consola y cierra QGIS automáticamente.

La solución a este problema, si necesito la API PyQGIS fuera de QGIS, fue incluir PYTHONPATH a QGIS ( / usr / share / qgis / python ) en mi .bashrc y ejecutar el script en la consola bash como python myscript. py . Funciona.

En Windows, puede obtener PYTHONPATH en la Consola Python de QGIS con:

import os
os.getcwd()

y use el Panel de control de Windows para cambiarlo.

xunilk
fuente
1
Lo intenté (como se señaló en la pregunta original). No funciona ¿Realmente has intentado esto desde la --codeopción o solo desde la consola? ¿Qué versión de QGIS está ejecutando?
Conley Owens
Por favor, vea mi "Nota de edición".
xunilk
1
Gracias por la ayuda, pero no estoy seguro de lo que quieres decir con ejecutar el script en la consola bash porque python myscript.py, ¿estás sugiriendo que use la API fuera de qgis donde tendría que manejar toda la sobrecarga de ejecutar QgsApplication.initQgis()y cargar el proyecto? ¿yo mismo? Si es así, esta es una ruta completamente diferente.
Conley Owens
1

Me funciona bien hacer esto:

import os
os._exit(0)

También es útil que pueda establecer un código de salida.

Marioba
fuente