Python Skript weiterlaufen lassen, wenn cmd/Skript "geschlossen" wird?
Hey!
Ich probiere aktuell ein Skript zu erstellen, welches es dem Benutzer ermöglicht eigene Systembenachrichtigungen zu erstellen.
Nun möchte ich zusätzlich, dass der Benutzer, nachdem er nur noch darauf wartet, dass die Benachrichtigung zu jener bestimmten Zeit , die er vorher festgelegt hat eintrifft, das Konsolenfenster beziehungsweise Skript schließen kann, es aber im Hintergrund noch weiter ausgeführt wird, sodass er das Fenster nicht permanent offen oder minimiert haben muss. Wie kann ich das umsetzen? Ich habe schon irgendwie versucht mit dem multiprocessing-Modul zu arbeiten, aber das schien nicht wirklich der richtige Weg zu sein. Ich hoffe man versteht was ich meine. Welche Module kann ich da für nehmen oder wie könnte man so etwas generell umsetzen, geht das überhaupt?
Vielen Dank im Voraus!!
3 Antworten
Ich bin kein Pothonprogrammierer!
Egal in welcher systemnahen Programmiersprache kann man auf native Systemfunktionen zugreifen.
Für die Art der Darstellung eines Fensters ist die Funktion "ShowWindow" in "user32.dll" zuständig.
hier eine kleine demonstration in Powershell:
#definiere Zugriff auf native Systemroutine zum Beeinflussen der Darstellungsart eines Fensters
$user32=Add-Type -m '[DllImport("user32.dll")] public static extern void ShowWindow(IntPtr hWnd, int nCmdShow);' -Name myAPI -passthru
#ermittle das Fensterhandle des Fensters dieses Scripts
$hwnd=(gps -id $PID).MainWindowHandle
Write-Host "Ich schalte dieses Fenster in 3 Sekunden aus und nach 3 weiteren Sekunden wieder an"
sleep 3
#schalte die Sichtbarkeit dieses Fenstes aus
$user32::ShowWindow($hwnd, 0)
sleep 3
$user32::ShowWindow($hwnd, 9)
pause
In Python scheint das alles wesentlich umständlicher zu sein.
ein paar links in die Richtung:
- https://docs.python.org/3/library/ctypes.html
- https://www.markjour.com/docs/pywin32-docs/win32gui.html
- https://stackoverflow.com/questions/17272572/get-window-handler-from-started-process
- https://stackoverflow.com/questions/44735798/pywin32-how-to-get-window-handle-from-process-handle-and-vice-versa
- https://superfastpython.com/multiprocessing-get-pid/#:~:text=We%20can%20get%20the%20pid%20for%20the%20current%20process%20via,getpid()%20function.&text=We%20may%20also%20get%20the%20pid%20for%20the%20parent%20process,getppid()%20function.
- https://www.markjour.com/docs/pywin32-docs/win32gui__FindWindow_meth.html
- https://www.markjour.com/docs/pywin32-docs/win32gui__ShowWindow_meth.html
Keine Ahnung ob ich nur nicht Gründlich genug gesucht habe.
Wenn es in Python wirklich so umständlich sein sollte das Hwnd auf das eigene Fenster zu ermitteln (wie ich momentan den Eindruck habe) kann bin ich glücklich mich nie näher mit dieser unsäglichen Sprache befasst zu haben.😁
Wenn ich Dir einen guten Rat geben darf. Lerne eine ordentliche Programmiersprache wie C#, C++
Python mag zwar in einfachen Sachen simple sein, aber wenns ans "Eingemachte" geht, wird es hässlich🤢
Danke nochmal, ich habe mich nicht mehr daran getraut vielleicht versuche ich es noch ein anderes Mal irgendwann! Vielen Dank für die vielen nützlichen Anregungen. Ich lerne jetzt auch C# haha
Ein Konsolenentkoppler wie screen oder tmux würde dir erlauben, den sichtbaren Teil der Konsole - das Fenster - zu schließen, während das Programm weiter läuft, und später kannst du wieder damit verbinden, um wieder angezeigt zu bekommen.
genauso wie man ein Fenster Maximieren/Minimieren kann, lässt es sich auch verstecken, das klappt durch die Bank mit jedem Fenster.
Wenn man ein fremdes Fenster versteckt, muss man nur darauf achten, das man sich das Handle "merkt" denn das wird, aus verständlichen Gründen, für abrufende Funktionen als 0 zurückgegeben. (sonst könnte man ja jede Hintergrundapp ans licht zerren)
Hallo.
Das dürfte als Konsolen-Applikation nicht möglich sein. Es wird ja aus der Konsole heraus gestartet. Wenn du diese schließt, schließt du das Programm.
Ansonsten könntest du ein Fenster kreieren, welches die Konsole aufruft um dort die Ausgabe zu handhaben. Das Fenster kannst du aber frei modifizieren, also auch unsichtbar machen.
Naja, wie bereits geschrieben, erstellst du ein eigenes Fenster. Dann läuft das Programm so lange, bis du das Fenster schließt.
Und das Fenster kannst du eben bearbeiten, wie du möchtest. Unter anderem auch z. B. unsichtbar machen. Dann könntest du ihm noch Hotkeys zuweisen, wodurch es wieder sichtbar wird für Einstellungen.
Wobei ich nicht so richtig verstehe, was das Problem an einer minimierten Anwendung wie der Konsole ist.
Vielleicht eine doofe Frage, aber was gibt es denn für Alternativen, wenn nicht als Konsolen-Applikation?