Windows Cmd Prozess beenden und Programm schließen

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
Patrick1990
User
Beiträge: 136
Registriert: Freitag 3. Juni 2016, 05:45

Hallo,

folgendes Problem:

Ich starte aus einem Python-Programm heraus mehrere Programme unter Windows durch

Code: Alles auswählen

processes = (Popen(cmd, shell=True, stdout=PIPE) for cmd in list_commands)
.

Die Liste der Kommandos beinhaltet jeweils einen Pfad zu einer Batch-Datei, die dann ausgeführt wird.

Nun werden nur so viele Progamme parallel gestartet, wie ich vorher festlege:

Code: Alles auswählen

running_processes = list(islice(processes, max_process_number))
Anschließend werden die laufenden Prozesse überwacht und sobald einer beendet wurde, wird ein neuer gestartet.
So lange, bis alle Programme (Prozesse) durchlaufen sind.

Nun möchte ich einen Timeout einbauen, welcher das laufende Programm bei Zeitüberschreitung beenden und erneut starten soll.
Hier liegt nun mein Problem - mit

Code: Alles auswählen

process.kill()
kann ich zwar den Prozess beenden, jedoch bleibt das Windows-Programm geöffnet - und das soll nicht sein.

Könnt ihr mir da irgendwie helfen, bzw. ist das überhaupt möglich?
Habe schon einiges gelesen, das sowas auf Unix-Systemen in Verbindung mit der Signal-Bibliothek funktioniert - aber leider nicht unter Windows.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Die Aussage "kann ich zwar den Prozess beenden, jedoch bleibt das Windows-Programm geöffnet" ist ein Widerspruch. Was passiert da genau, welches Verhalten sprichst du da an?
Patrick1990
User
Beiträge: 136
Registriert: Freitag 3. Juni 2016, 05:45

Verstehe jetzt nicht worauf du hinaus willst.
Ich meine das process.kill() nicht das Windows-Progamm schließt.
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn Du eine Batch-Datei startest, die wiederum andere Programme startet, dann sind die anderen Programme unter Windows unabhängig vom ursprünglichen startenden Programm. Mit psutil kannst Du über children alle Kindprozesse finden. Das kannst Du dann rekursiv machen, um den gesamten Baum an Prozessen zu finden, die von Deinem Batch-Skript gestartet wurden und sie allesamt beenden.
Zuletzt geändert von Sirius3 am Dienstag 30. Juli 2019, 10:29, insgesamt 1-mal geändert.
Patrick1990
User
Beiträge: 136
Registriert: Freitag 3. Juni 2016, 05:45

Sowas in der Art dachte ich mir schon - wäre es ein Möglichkeit die Programme direkt aus Python zu starten ohne die Batch-Datei bzw. wäre mein Vorhaben dann realisierbar?
Ich muss letztendlich sowas in der Art

Code: Alles auswählen

%Windows_Programm%  -runscriptandexit %Skript_welches_von_Windows_Programm_gelesen_wird% 
generieren.
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Muß mich korrigieren:
Mit psutil kannst Du über children alle Kindprozesse finden. Das kannst Du dann rekursiv machen, um den gesamten Baum an Prozessen zu finden, die von Deinem Batch-Skript gestartet wurden und sie allesamt beenden.
Benutzeravatar
__blackjack__
User
Beiträge: 14045
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Patrick1990: Das klingt alles ein bisschen als würdest Du einem `multiprocessing.Pool` selbst nachprogrammieren – warum?

Was die Frage der Batchdatei angeht: Probier's doch einfach aus.

Ich bin mir jetzt nicht ganz sicher was Deine Syntax da bedeuten soll, also ob ``%Windows_Programm%`` tatsächlich so in der Batch-Datei steht oder ob das hier als Platzhalter/Umgebungsvariable gemeint ist. Umgebungsvariablen kann man in Python jedenfalls abfragen: `sys.environ`.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Patrick1990
User
Beiträge: 136
Registriert: Freitag 3. Juni 2016, 05:45

Das waren gerade nur Platzhalter fürs Forum.

Ich habe mich mit dem Multiprocessing-Modul noch nicht auseinander gesetzt - sollte ich evtl. mal machen wenn es evtl. Vorteile bietet.
Benutzeravatar
__blackjack__
User
Beiträge: 14045
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Alternativ wäre auch `concurrent.futures` interessant.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Patrick1990
User
Beiträge: 136
Registriert: Freitag 3. Juni 2016, 05:45

Habe nun meinen vorherigen Code mit concurrent.futures nachgestellt.
Hier gibt es auch die Möglichkeit einen Timeout zu realisieren.
Werde nun mal die von Sirius3 beschriebene Methode versuchen umzusetzen, um die von den Batch-Skripten aufgerufenen Programme zu schließen.
Anschließend muss ich diese erneut starten.
Patrick1990
User
Beiträge: 136
Registriert: Freitag 3. Juni 2016, 05:45

Bekomme leider keinen Zugriff auf die von den Batch-Dateien ausgeführten Prozesse - kann sie also nicht beenden.
Antworten