In Python 2.5, come faccio a uccidere un sottoprocesso?
-
21-08-2019 - |
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.
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;)