Frage

Ich bin mit dem Subprozess Paket in Python ein Subprozess laufen, die später muß ich töten. Allerdings heißt es in der Dokumentation des subprocess Pakets, dass die terminate () Funktion von 2.6 nur verfügbar ist,

Wir laufen Linux mit 2,5 und für die Abwärtskompatibilitätsgründen kann ich nicht auf 2.6 aktualisieren, was ist die Alternative? Ich vermute, dass diese Funktionen sind bequeme Methoden für etwas.

War es hilfreich?

Lösung

Sie rufen os.kill auf den Prozess pid.

os.kill(process.pid, signal.SIGKILL)

Sie sind in Ordnung, weil Sie auf Linux sind. Windows-Benutzer sind kein Glück.

Andere Tipps

Zur Vervollständigung @ Gareth Antwort, auf Windows Sie tun:

import ctypes
PROCESS_TERMINATE = 1
handle = ctypes.windll.kernel32.OpenProcess(PROCESS_TERMINATE, False, theprocess.pid)
ctypes.windll.kernel32.TerminateProcess(handle, -1)
ctypes.windll.kernel32.CloseHandle(handle)

nicht ganz so elegant wie os.kill(theprocess.pid, 9), aber es funktioniert; -)

Um @ Gareths und @ Alex Antworten zu vervollständigen, wenn Sie mit dem darunter liegenden System wollen nicht stören, können Sie psutil .

  

psutil ist ein Modul, ein Bereitstellen   Schnittstelle zum Abrufen von Informationen   auf die laufenden Prozesse und System   Auslastung (CPU, Speicher) in einem   tragbare Art und Weise Python unter Verwendung,   Umsetzung viele Funktionalitäten   von Kommandozeilen-Tools wie ps angeboten,   oben, töten und Windows-Task-Manager.

     

Es unterstützt derzeit Linux, OS X,   FreeBSD und Windows mit Python   Versionen 2,4-3,1 durch eine Verwendung   einzigartige Code-Basis.

Das ist eine Kopie & pase Komplettlösung:

def terminate_process(pid):
    # all this shit is because we are stuck with Python 2.5 and 
    # we cannot use Popen.terminate()
    if sys.platform == 'win32':
        import ctypes
        PROCESS_TERMINATE = 1
        handle = ctypes.windll.kernel32.OpenProcess(PROCESS_TERMINATE, False, pid)
        ctypes.windll.kernel32.TerminateProcess(handle, -1)
        ctypes.windll.kernel32.CloseHandle(handle)
    else:
        os.kill(pid, signal.SIGKILL)

Akzeptieren Fehlerberichte als Kommentare;)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top