Subprocess während eines Prozesses abbrechen

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.
azami1986
User
Beiträge: 20
Registriert: Mittwoch 29. Oktober 2008, 10:35

Hallo Leute,

wisst ihr vielleucht wie man einen Prozess, der mit subprocess gestartet wurde in python abbrechen kann? Gibt es einen Kill befehl oder ähnlich?
Hab in der API nichts gefunden...

Wäre sehr dankbar, wenn da jemand was wüsste... :-)

Viele Grüße
Azami
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

du könntest doch per "pid", die ID des Prozess herausfinden und dann killen.
azami1986
User
Beiträge: 20
Registriert: Mittwoch 29. Oktober 2008, 10:35

Danke für die Antwort. Kannst du vielleicht ein kleines Beispiel machen. Bin echt noch ein newbie :-)

PS: Das soll unter Windows XP funktionieren
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:


GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
azami1986
User
Beiträge: 20
Registriert: Mittwoch 29. Oktober 2008, 10:35

Danke für den Hinweis.

geht das auch ohne dem import von win32api

Das ist in der standard library nicht enthalten. Kann man das nicht mit internen librarys lösen? Sonst müsste jeder der eine Anwendung auf seinem Rechner laufen lässt, diese Library runterladen...


Ich habe das hier gefunden. Nur wird hier auch die win32api benötigt...

Code: Alles auswählen


def kill(pid):
    handle = win32api.OpenProcess(1, 0, pid)
    print str((0 != win32api.TerminateProcess(handle, 0)))
    return (0 != win32api.TerminateProcess(handle, 0))

def init_process():
    #startet programm.exe und beendet es wieder nach 5 Sekunden
    pz1 = subprocess.Popen('programm.exe')
    kill(pz1.pid) 
Oder lieg ich da falsch?
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

so würde es auch gehen:

Code: Alles auswählen

prozess = subprocess.Popen('C:\\Programme\\Mozilla Firefox\\firefox.exe')
subprocess.Popen(['taskkill', prozess.pid])
Zuletzt geändert von nemomuk am Freitag 31. Oktober 2008, 15:28, insgesamt 1-mal geändert.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Richtig, es gibt keine platformunabhängige API.

Statt der Win32 API kann man an der Stelle inzwischen wohl auch ctypes verwenden (also man nutzt weiterhin die API nur eben nicht über win32api sondern direkt über die URL). Man muss nur gucken wie das in C geht und das dann genauso machen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

os.kill() wird unter Windows nicht unterstützt. Warum eigentlich nicht?

Somit kann man keine Prozesse mit plain Python unter Windows abschießen. Naja... Man könnte per subprocess "taskkill" benutzten. Ist aber IMHO nicht in allen Windows Varianten vorhanden (Home Edition)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

die Taskkill.exe könnte man aber einfach mitliefern mit dem Projekt...
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Was ist mit der Lizenz? Ist bestimmt keine Freeware ;)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

also wenn ich nach Taskkill.exe im Internet suche, finde ich zumindest ziemlich viele Download Quellen^^ (was allerdings nicht heißt, dass es damit auch erlaubt ist...)
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Was ist mit `Popen.terminate()` (neu in Py 2.6)?
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

jens hat geschrieben:os.kill() wird unter Windows nicht unterstützt. Warum eigentlich nicht?
Habe ich mich auch öfter schon gefragt. Schließlich bietet die API das durchaus an, wenn auch nicht unter diesem Namen.

Edit: ``terminate()`` schaut gut aus, allerdings geht das nicht mit beliebigen PIDs, sondern eben wie das Modul auch benannt ist, mit Subprozessen. Schade.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
azami1986
User
Beiträge: 20
Registriert: Mittwoch 29. Oktober 2008, 10:35

Wie würde es mit terminate() funktionieren?

Code: Alles auswählen

myProcess.pid.terminate()
Das funktioniert irgendwie nicht??

PS: Hab python 2.5
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

azami1986 hat geschrieben:Das funktioniert irgendwie nicht??
Das funktioniert erstens nur mit Prozessen die du selbst über ``subprocess.Popen`` gestartet hast und zweitens erst ab Python 2.6.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

ich kenne terminate nicht...

Aber ich denke der Aufbau ist eher so:

Code: Alles auswählen

myProcess = subprocess.Popen('test.exe')
myProcess.terminate()
Qubit
User
Beiträge: 128
Registriert: Dienstag 7. Oktober 2008, 09:07

azami1986 hat geschrieben:Hallo Leute,

wisst ihr vielleucht wie man einen Prozess, der mit subprocess gestartet wurde in python abbrechen kann? Gibt es einen Kill befehl oder ähnlich?
Hab in der API nichts gefunden...

Wäre sehr dankbar, wenn da jemand was wüsste... :-)
Standardmäßig nicht.
Aber schau dir mal die proctools von pycopia an ;-)
http://code.google.com/p/pycopia/source ... s.py?r=102
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Qubit hat geschrieben:Aber schau dir mal die proctools von pycopia an ;-)
Sieht spontan nach linux-only aus ;)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Qubit
User
Beiträge: 128
Registriert: Dienstag 7. Oktober 2008, 09:07

jens hat geschrieben:
Qubit hat geschrieben:Aber schau dir mal die proctools von pycopia an ;-)
Sieht spontan nach linux-only aus ;)
Ups, ja.
Man sollte Windows abschaffen ;-)
wie schauts denn mit

import _subprocess
_subprocess.TerminateProcess(..)

aus?
Hat jemand damit unter Windows Erfahrung?
lunar

jens hat geschrieben:os.kill() wird unter Windows nicht unterstützt. Warum eigentlich nicht?
Weil diese Funktionalität auf Windows-Systemen nicht existiert. "os.kill()" ist – trotz seines Namens – keine Funktion zum Töten von Prozessen, sondern lediglich zum Senden von Signalen. Man mittels os.kill auch ganz andere Dinge vollführen, wie z.B. per "os.kill(pid, signal.SIGUSR1)" Dienste dazu bewegen, ihre Konfiguration neu einzulesen oder per "os.kill(pid, signal.SIGSTOP)" Prozesse anhalten.

Zumindest ältere Windows-Systeme haben keine Entsprechung zu POSIX-Signalen, sondern kennen de facto lediglich das Abbrechen und das Töten von Prozessen. Unter Vista mag das anders sein, da wurde das POSIX-Subsystem imho deutlich erweitert.

Deswegen kann man "os.kill" zumindest in seiner derzeitigen Semantik nicht plattformübergreifend implementieren, da etwas wie "os.kill(pid, 17)" unter Windows überhaupt nicht definiert ist.

De facto ist die Behandlung von Prozessen auf Windows und auf POSIX-Systemen so unterschiedlich, dass eine einheitliche, plattformübergreifend identische Funktionalität kaum zu realisieren ist. Die meisten plattformübergreifenden Toolkits kennen deswegen eigentlich auch nur das Töten von Prozessen. Ein "os.terminate" wäre also der bessere Weg, das Töten von Prozessen zu implementieren.

Eigentlich halte ich es aber für sinnvoller, diese Dinge plattformspezifisch zu lösen, da die Unterschiede hier imho zu groß für eine einheitliche API sind. Das fängt ja schon damit an, dass es außer GUI-Programmen wie Firefox kaum plattformübergreifende Programme gibt, die auf beiden Systemen zuverlässig laufen. Desweiteren fehlt ja auch eine API, Prozesse zu identifizieren, ohne die eine Funktion zum Töten eher sinnlos wäre.
Antworten