2009-06-30 2 views
28

Sto usando il pacchetto di sottoprocesso in Python per eseguire un sottoprocesso, che in seguito ho bisogno di uccidere. Tuttavia, la documentazione del pacchetto subprocess indica che la funzione terminate() è disponibile solo da 2.6In Python 2.5, come si elimina un sottoprocesso?

Stiamo eseguendo Linux con 2.5 e per motivi di compatibilità a ritroso non è possibile eseguire l'aggiornamento a 2.6, qual è l'alternativa? Immagino che queste funzioni siano metodi di convenienza per qualcosa.

+1

fresco: Se mi incollo insieme le risposte ottengo codice 'portatile'! – Blauohr

+1

C'è una risposta portatile già incollata http://stackoverflow.com/a/8536476/192632 – bogdan

risposta

40

Si chiama os.kill sul processo pid.

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

Stai bene perché sei su Linux. Gli utenti di Windows non hanno fortuna.

+3

os.kill (p.pid, signal.SIGTERM) per essere più precisi –

+1

"kill 123" invia SIGTERM. "kill -9 123" invia SIGKILL. Sii gentile con il processo e prova prima SIGTERM. – Jabba

40

Per completare @ risposta di Gareth, su Windows che fate:

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) 
non

abbastanza elegante come os.kill(theprocess.pid, 9), ma funziona ;-)

6

Al fine di completare @ Gareth e di risposte @alex , se non vuoi disturbarti con il sistema di underlaying, puoi usare psutil.

psutil è un modulo che fornisce un'interfaccia per recuperare informazioni sui processi correnti e sistema utilizzo (CPU, memoria) in modo portatile utilizzando Python, attuazione molteplici funzionalità offerte dagli strumenti linea di comando come ps, top, kill e il task manager di Windows.

Attualmente supporta Linux, OS X, FreeBSD e Windows con Python versioni da 2,4 a 3,1 utilizzando una base di codice univoco .

4

Quello è un copia & pase soluzione completa:

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) 

Accettare segnalazioni di bug come commenti;)