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.
Qubit
User
Beiträge: 75
Registriert: Dienstag 7. Oktober 2008, 09:07

Samstag 1. November 2008, 23:15

lunar hat geschrieben:Woher soll diese PID denn kommen, die du da an os.kill weitergeben möchtest?
Hm, übersehe ich jetzt etwas?

Code: Alles auswählen

p = subprocess.Popen(
    ["ping","-n","100","127.0.0.1"],
    shell=False
    )
print "PID:",p.pid
time.sleep(10)
print "terminate?"
p2= subprocess.Popen(
    ["taskkill","/PID",str(p.pid)],
    shell=True
    )
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Samstag 1. November 2008, 23:44

``shell=True`` ist wieder so eine Sache die man nach Möglichkeit vermeiden sollte.

Und ja, du hast die Diskussion falsch verstanden. Lunar und ich diskutierten darüber, wie man Prozesse beenden kann. Bei Prozessen die man selbst via ``subprocess.Popen`` startet geht das seit Python 2.6 mit ``terminate`` und ``kill``. Bei beliebigen Prozessen mit bekannter PID geht das nur unter Unix mit ``os.kill``, unter Windows gar nicht (das ist eben der Punkt den ich kritisiert habe und Lunar verteidigte) mit normalen Bordmitteln, geht nur mit ctypes, was zumindest seit Python 2.5 teil von Python ist. Lunars Argumentation war, dass man unter Windows keine Tools hat um die Prozesse und PIDs herauszulesen (es gibt ein paar, aber die gehören im Gegensatz zu ``ps`` nicht zum Standardumfang aller Windows-Versionen), man also sowieso nie in die Situation kommt, mit ``os.kill()`` Prozesse beenden zu wollen. Mein Punkt war, dass es durchaus Mittel und Wege gibt, auch unter Windows die PID herauszufinden. Soll jeder selbst entscheiden welcher Argumentation er eher zustimmt.

The real WTF ist aber, dass weder Lunar noch ich Windows überhaupt nutzen, somit betrifft das Problem eigentlich keinen von uns direkt :D
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Qubit
User
Beiträge: 75
Registriert: Dienstag 7. Oktober 2008, 09:07

Samstag 1. November 2008, 23:45

Qubit hat geschrieben:
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?
Okay, hatte etwas Zeit mich damit zu beschäftigen (Win Vista)
'2.5.1 (r251:54863) [MSC v.1310 32 bit (Intel)]'

Code: Alles auswählen

import subprocess, _subprocess

p = subprocess.Popen(
    ["ping","-n","100","127.0.0.1"],
    shell=False
    )
time.sleep(10)
print "terminate process:",p.pid
_subprocess.TerminateProcess(p._handle,1)
Antworten