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
Subprocess während eines Prozesses abbrechen
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Schau dir mal das an: http://trac.pylucid.net/browser/trunk/p ... y?rev=1634
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...
Oder lieg ich da falsch?
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)
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.
-
- 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.
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
- 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)
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)
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Habe ich mich auch öfter schon gefragt. Schließlich bietet die API das durchaus an, wenn auch nicht unter diesem Namen.jens hat geschrieben:os.kill() wird unter Windows nicht unterstützt. Warum eigentlich nicht?
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
Wie würde es mit terminate() funktionieren?
Das funktioniert irgendwie nicht??
PS: Hab python 2.5
Code: Alles auswählen
myProcess.pid.terminate()
PS: Hab python 2.5
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Das funktioniert erstens nur mit Prozessen die du selbst über ``subprocess.Popen`` gestartet hast und zweitens erst ab Python 2.6.azami1986 hat geschrieben:Das funktioniert irgendwie nicht??
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
ich kenne terminate nicht...
Aber ich denke der Aufbau ist eher so:
Aber ich denke der Aufbau ist eher so:
Code: Alles auswählen
myProcess = subprocess.Popen('test.exe')
myProcess.terminate()
Standardmäßig nicht.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...
Aber schau dir mal die proctools von pycopia an
http://code.google.com/p/pycopia/source ... s.py?r=102
Ups, ja.jens hat geschrieben:Sieht spontan nach linux-only ausQubit hat geschrieben:Aber schau dir mal die proctools von pycopia an
Man sollte Windows abschaffen
wie schauts denn mit
import _subprocess
_subprocess.TerminateProcess(..)
aus?
Hat jemand damit unter Windows Erfahrung?
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.jens hat geschrieben:os.kill() wird unter Windows nicht unterstützt. Warum eigentlich nicht?
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.