Chciałbym uruchomić skrypt Pythona, qgis --code myscript.py
a następnie natychmiast wyjść. Używam iface.actionExit().trigger()
, który zabija QGIS, gdy uruchamiam go z konsoli Pythona, ale nie po włożeniu do skryptu, który przekazuję --code
.
Jaki jest właściwy sposób natychmiastowego wyjścia? Korzystam z QGIS 2.0.1
Aktualizacja : Próbowałem też sys.exit()
. QGIS łapie go i wyświetla okno z następującymi informacjami:
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
Aktualizacja : os.kill(os.getpid(), 9)
działa, ale jest to brudny hack i szukam czegoś lepszego.
--screenshot
flaga po prostu go nie wycina).sys.exit()
w moich skryptach, które działały.echo "sys.exit()" > code.py; qgis --code code.py
Jaką wersję QGIS prowadziłeś? Jak wywoływałeś skrypty?Odpowiedzi:
Wypróbuj w swoim skrypcie:
Mi to pasuje.
Uwaga do edycji:
Oparty na komentarzu Conleya Owensa, zmieniłem nieco skrypt, aby zrobić „coś użytecznego” (w którym skomentowano wiersz importujący iface ).
Uruchomiłem qgis --code myscript.py w konsoli bash, w folderze skryptu i natychmiast otrzymałem ten komunikat o błędzie:
i wskazując, że z qgis.utils zaimportuj linię iface .
Gdy pierwszy wiersz nie jest komentowany, wykonanie skryptu nie zawierało błędów:
ale kontrola nie była w konsoli Pythona; znajduje się w konsoli bash (zobacz tam wydruk „Hello”). Z tego powodu twoje polecenie os.kill (os.getpid (), 9) działa, ponieważ zamknij konsolę i automatycznie zamknij QGIS.
Rozwiązaniem tego problemu, jeśli potrzebuję API PyQGIS poza QGIS, było włączenie PYTHONPATH do QGIS ( / usr / share / qgis / python ) w moim .bashrc i uruchomienie skryptu w konsoli bash jako myscript w Pythonie. py . To działa.
W systemie Windows można uzyskać PYTHONPATH w konsoli Python QGIS za pomocą:
i użyj Panelu sterowania systemu Windows, aby go zmienić.
źródło
--code
opcji lub tylko z konsoli? Jaką wersję QGIS używasz?python myscript.py
sugerujesz, żebym używał interfejsu API poza qgis, gdzie musiałbym wtedy zająć się całym nakładem pracyQgsApplication.initQgis()
i ładowaniem projektu siebie? Jeśli tak, to idzie to zupełnie inną drogą.Dobrze mi to robi:
Przydatne jest również ustawienie kodu wyjścia.
źródło