Korrekter Weg zwei Programme nacheinander zu starten

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
jb_alvarado
User
Beiträge: 55
Registriert: Mittwoch 11. Juli 2018, 11:11

Hallo Allerseits,

ich hätte gerne vom Prinzip her ein Starterscript, welches ein zweites Script mit Dialog startet, dieses führt per git ein Update durch, und anschließend soll mein Hauptprogramm gestartet werden.

Mein Starterscript schaut dabei in etwa so aus:

Code: Alles auswählen

import sys
from time import sleep

from modules import main, updater

if __name__ == "__main__":
    if len(sys.argv) == 1:
        try:
            updater.start_updater()
        except ImportError as e:
            print('Error in git module:\n{}'.format(e))
        sleep(0.3)

    main.start_main()
updater.py:

Code: Alles auswählen

...

def start_updater():
    app = QApplication(sys.argv)

    update = UpdateFrame()
    update.window.show()

    app.exec_()
main.py:

Code: Alles auswählen

...

def start_main():
    app = QApplication.instance()

    if app is None:
        app = QApplication(sys.argv)

    main_window = MainForm()

    app.aboutToQuit.connect(main_window.quit_application)
    app.exec_()
Wenn ich jetzt app.exec_() in mein Starterscript verschieben würde wird main.py nicht gestartet, nachdem der updater fertig ist, sondern fast zeitgleich.

So wie ich das oben habe scheint mir das nicht richtig zu laufen. Am liebsten wäre mir, wenn die zwei Programme wirklich komplett separate voneinander starten, also beide haben ihr QApplication. Aber selbst ein QApplication.quit() reicht nicht aus. Bekomme da jedes mal eine Fehlermeldung dass nur eine QApplication Instanz gestartet werden darf.

Wie würde man das denn richtig machen?
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@jb_alvarado: Wenn das zwei unabhängige Programme sind, dann müsstest Du die eben auch so behandeln und tatsächlich einen weiteren Prozess starten, statt das alles im selben Prozess auszuführen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Ein Paket das modules heißt, ist schlecht, da viel zu allgemein und im allgemeinen auch falsch. Benenne das Paket nach dem Inhalt.
In start_updater sollte es eigentlich keinen ImportError geben, weil alle Importe schon oben bei Import erfolgen, die Fehlermeldung ist so allgemein auch viel zu speziell. Wenn es um ein spezielles git-Modul geht, das vielleicht nicht importierbar ist dann mache das Explizit, an der Stelle, wo es importiert wird.

Um die Frage beantworten zu können, müßte man wissen, was denn geupdated werden soll, das Programm, Konfigurationsdateien für das Programm, etc.
Im ersten Fall wären zwei getrennte Prozesse richtig, im zweiten Fall eine engere Integration in main.
jb_alvarado
User
Beiträge: 55
Registriert: Mittwoch 11. Juli 2018, 11:11

Ich danke euch für die Antwort! Ich werde das dann wohl doch in zwei Prozessen laufen lassen.

@Sirius3, in dem modules Ordner liegen meine Pythenscripte drin, die ich für das Programm verwende. Wollte das nicht lib nennen, weil ich schon ein lib Ordner habe, in dem dlls drin liegen. Verwende das ja nur innerhalb des Programms, mir ist da aber auch nichts besseres eingefallen...

Das mit dem ImportError stimmt... Hatte vorher den import im try-Befehl drin, weil ich sicherstellen wollte, dass das Tool auch auf Systemen läuft, die kein git installiert haben. Muss das wieder korrigieren.

Geupdatet wird das gesamte Programm.
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Also Fall1. Zwei getrennte Programme, denn sonst wäre ja der Import vom Anfang für main veraltet.
Antworten