Skript schließt sofort nach Doppelklick

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
T1m
User
Beiträge: 5
Registriert: Freitag 30. August 2013, 07:35

Guten Morgen :)

Ich habe das Problem, dass wenn ich mein Pythonskript per Doppelklick starte, sich nur kurz die Konsole öffnet und sofort wieder schließt. Das Skript lässt sich jedoch einwandfrei mit der IDLE ausführen, daher denke ich das es nicht am Quellcode liegt.

Trotzdem hier noch der Code:

Code: Alles auswählen


import os
from _thread import start_new_thread
from eins_DU import eins
from zwei_DU import zwei
from drei_DU import drei
from vier_DU import vier
from fünf_DU import fünf

def main():
    
    if os.path.isdir('./Du'):
        pass
    else:
        os.mkdir('./Du')
        print("Verzeichnis Du angelegt! \n")

    start_new_thread(eins,(0,))
    start_new_thread(zwei,(0,))
    start_new_thread(drei,(0,))
    start_new_thread(vier,(0,))
    start_new_thread(fünf,(0,))
    
if __name__ == "__main__":
    main()


Ich würde mich sehr drüber freuen, wenn mir jemand weiterhelfen könnte. :D

Grüße, T1m :D
Benutzeravatar
darktrym
User
Beiträge: 785
Registriert: Freitag 24. April 2009, 09:26

Warum sollte es was anderes tun?
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Weshalb glaubst Du denn, dass die Konsole geöffnet bleiben sollte? Gibt ja keinen Grund dafür, oder?

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
BlackJack

@T1m: Noch ein paar Anmerkungen: Ein einzelner führender Unterstrich bei einem Namen bedeutet, dass dieses Objekt nicht zur öffentlichen API gehört. Das `_thread`-Modul ist also nicht dazu gedacht von Dir benutzt zu werden. Für Threads gibt es das `threading`-Modul.

Bei den `Thread`-Objekten kann über das Daemon-Flag auch entscheiden ob die am Ende des Hauptprogramms einfach mit beendet werden, oder ob das gesamte Programm solange läuft wie mindestens einer dieser Threads läuft. Wobei es schon sauberer wäre, wenn man im Hauptprogramm dann einfach mit `join()` auf das Ende der Threads warten würde. Zumindest wäre es dann offensichtlicher dass das Programm an der Stelle noch nicht zuende ist.

Die Namensgebung der Module und Funktionen daraus sind hoffentlich nur Beispiele.

Der ``if``-Zweig mit dem ``pass`` ist unnötig. Da würde man einfach die Bedingung mit ``not`` negieren.

Werte wie Pfadnamen sollte man nicht mehrfach im Quelltext wiederholen sondern an eine Konstante binden. Dann muss man den Namen nur an einer Stelle anpassen wenn man ihn mal ändern will oder muss.

Bei einem Start durch Doppelklick stellt sich auch die interessante Frage was in dem Fall das aktuelle Arbeitsverzeichnis ist.

Edit: (ungetestet)

Code: Alles auswählen

import os
from threading import Thread
from eins_DU import eins
from zwei_DU import zwei
from drei_DU import drei
from vier_DU import vier
from fuenf_DU import fuenf

DU_PATH = 'Du'


def main():
    if not os.path.isdir(DU_PATH):
        os.mkdir(DU_PATH)
        print('Verzeichnis {0} angelegt!\n'.format(DU_PATH))

    threads = [
        Thread(target=f, args=(0,)) for f in [eins, zwei, drei, vier, fuenf]
    ]
    for thread in threads:
        thread.start()
    for thread in threads:
        thread.join()


if __name__ == '__main__':
    main()
T1m
User
Beiträge: 5
Registriert: Freitag 30. August 2013, 07:35

Danke BlackJack :) dein Beitrag ist sehr auf­schluss­reich. Jetzt funktioniert alles und ich habe wieder was dazu gelernt. :)

Grüße, T1m :D
Antworten