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

Freitag 31. Oktober 2008, 13:51

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

Freitag 31. Oktober 2008, 14:47

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

Freitag 31. Oktober 2008, 14:53

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
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Freitag 31. Oktober 2008, 15:19


CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
azami1986
User
Beiträge: 20
Registriert: Mittwoch 29. Oktober 2008, 10:35

Freitag 31. Oktober 2008, 15:24

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

Freitag 31. Oktober 2008, 15:25

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
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 31. Oktober 2008, 15:26

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 Modvoice
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Freitag 31. Oktober 2008, 15:27

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)

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Freitag 31. Oktober 2008, 15:29

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

Freitag 31. Oktober 2008, 15:30

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

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Freitag 31. Oktober 2008, 15:31

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

Freitag 31. Oktober 2008, 15:33

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

Freitag 31. Oktober 2008, 15:34

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

Freitag 31. Oktober 2008, 15:47

Wie würde es mit terminate() funktionieren?

Code: Alles auswählen

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

PS: Hab python 2.5
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 31. Oktober 2008, 15:52

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 Modvoice
Antworten