Wie beende ich QGIS nach dem Ausführen eines Python-Skripts?

10

Ich möchte ein Python-Skript über ausführen qgis --code myscript.pyund dann sofort beenden. Ich verwende iface.actionExit().trigger(), wodurch QGIS beendet wird, wenn ich es über die Python-Konsole ausführe, aber nicht, wenn es in das Skript eingefügt wird, an das ich übergebe --code.

Was ist der richtige Weg, um sofort zu beenden? Ich verwende QGIS 2.0.1

Update : Ich habe es auch versucht sys.exit(). QGIS fängt es auf und öffnet ein Fenster mit den folgenden Angaben:

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

Update : os.kill(os.getpid(), 9)funktioniert, aber es ist ein schmutziger Hack und ich suche etwas Besseres.

Conley Owens
quelle
1
Sie können aber warum?
Nathan W
1
Ich mache automatisch ein PDF mit einem Print-Komponisten (die --screenshotFlagge schneidet es einfach nicht).
Conley Owens
Könnten Sie bitte Ihren Code in die Frage aufnehmen, da dies potenziellen Antwortenden helfen könnte? Ich frage dies, da ich es auch sys.exit()in meinen Skripten verwendet habe, die funktioniert haben.
Joseph
echo "sys.exit()" > code.py; qgis --code code.pyWelche Version von QGIS haben Sie ausgeführt? Wie haben Sie die Skripte aufgerufen?
Conley Owens

Antworten:

5

Versuchen Sie es in Ihrem Skript:

from qgis.utils import iface

#your code here

iface.actionExit().trigger()

Für mich geht das.

Bearbeitungshinweis:

Basierend auf Conley Owens 'Kommentar habe ich mein Skript leicht geändert, um "etwas Nützliches" zu tun (wobei die Zeile, die iface importiert, kommentiert wurde).

#from qgis.utils import iface
import os

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

iface.actionExit().trigger()

Ich habe qgis --code myscript.py an der Bash-Konsole im Ordner des Skripts ausgeführt und sofort die folgende Fehlermeldung erhalten:

Geben Sie hier die Bildbeschreibung ein

und darauf hinweisen, dass aus qgis.utils eine iface- Zeile importiert werden muss.

Wenn die erste Zeile nicht kommentiert ist, hatte die Skriptausführung keine Fehler:

Geben Sie hier die Bildbeschreibung ein

Das Steuerelement befand sich jedoch nicht in der Python-Konsole. Es befindet sich in der Bash-Konsole (beachten Sie den "Hallo" -Druck dort). Aus diesem Grund funktioniert Ihr Befehl os.kill (os.getpid (), 9), da die Konsole geschlossen und QGIS automatisch geschlossen wird.

Die Lösung für dieses Problem bestand darin, wenn ich die PyQGIS-API außerhalb von QGIS benötige, PYTHONPATH to QGIS ( / usr / share / qgis / python ) in meine .bashrc-Datei aufzunehmen und das Skript in der Bash-Konsole als Python-Myscript auszuführen. py . Es klappt.

In Windows können Sie den PYTHONPATH in der Python-Konsole von QGIS herunterladen mit:

import os
os.getcwd()

und verwenden Sie die Systemsteuerung von Windows, um sie zu ändern.

xunilk
quelle
1
Ich habe es versucht (wie in der ursprünglichen Frage angegeben). Es funktioniert nicht. Haben Sie dies tatsächlich über die --codeOption oder nur über die Konsole versucht ? Welche Version von QGIS verwenden Sie?
Conley Owens
Bitte beachten Sie meine "Bearbeitungsnotiz".
Xunilk
1
Vielen Dank für die Hilfe, aber ich bin mir nicht sicher, was Sie unter Ausführen des Skripts in der Bash-Konsole verstehen. python myscript.pySie schlagen vor, die API außerhalb von qgis zu verwenden, wo ich dann den gesamten Aufwand für das Ausführen QgsApplication.initQgis()und Laden des Projekts übernehmen müsste mich selber? Wenn ja, geht dies einen ganz anderen Weg.
Conley Owens
1

Es funktioniert gut für mich, dies zu tun:

import os
os._exit(0)

Es ist auch nützlich, dass Sie einen Exit-Code festlegen können.

Marioba
quelle