Domanda

Sto usando il pacchetto di sottoprocesso in Python per eseguire un sottoprocesso, che poi ho bisogno di uccidere. Tuttavia, la documentazione del pacchetto sottoprocesso afferma che la funzione terminate () è disponibile solo da 2,6

Ci sono in esecuzione Linux con 2.5 e per ragioni di compatibilità all'indietro non posso eseguire l'aggiornamento a 2.6, qual è l'alternativa? Sto indovinando che queste funzioni sono metodi di convenienza per qualcosa.

È stato utile?

Soluzione

Si chiama os.kill sul pid processo.

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

Sei OK perché sei in su Linux. Gli utenti di Windows sono fuori di fortuna.

Altri suggerimenti

Per completare @ risposta di Gareth, su Windows fare:

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 è così elegante come os.kill(theprocess.pid, 9), ma funziona; -)

Al fine di completare @ Gareth e di risposte @alex, se non si vuole perdere tempo con il sistema underlaying, è possibile utilizzare psutil .

  

psutil è un modulo che fornisce un   interfaccia per il recupero delle informazioni   sui processi in esecuzione e il sistema   utilizzo (CPU, memoria) in una   modo portabile utilizzando Python,   attuazione molte funzionalità   offerto da strumenti da riga di comando come ps,   top, uccidere e task manager di Windows.

     

Attualmente supporta Linux, OS X,   FreeBSD e Windows con Python   versioni da 2.4 a 3.1 utilizzando un   base di codice unico.

Questo è una soluzione completa di copia & pase:

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)

L'accettazione segnalazioni di bug come commenti;)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top