2009-06-30 3 views
28

J'utilise le paquet de sous-processus en Python pour lancer un sous-processus, que je dois ensuite tuer. Cependant, la documentation du paquet subprocess indique que la fonction terminate() n'est disponible qu'à partir de la version 2.6. Nous fonctionnons sous Linux avec la version 2.5 et pour des raisons de rétrocompatibilité je ne peux pas passer à 2.6, quelle est l'alternative? Je devine que ces fonctions sont des méthodes de commodité pour quelque chose.Dans Python 2.5, comment est-ce que je peux tuer un sous-processus?

+1

Cool: Si je colle ensemble les réponses que je reçois le code 'portable'! – Blauohr

+1

Il ya une réponse portable déjà collée http://stackoverflow.com/a/8536476/192632 – bogdan

Répondre

40

Vous appelez os.kill sur le processus pid.

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

Vous êtes OK parce que vous êtes sous Linux. Les utilisateurs de Windows n'ont pas de chance.

+3

os.kill (p.pid, signal.SIGTERM) pour être plus précis –

+1

"kill 123" envoie SIGTERM. "kill -9 123" envoie SIGKILL. Soyez gentil avec le processus et essayez d'abord SIGTERM. – Jabba

40

Pour compléter @ réponse de Gareth, sous Windows, vous faites:

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) 

pas tout à fait aussi élégant que os.kill(theprocess.pid, 9), mais il ne fonctionne ;-)

6

Afin de compléter @ réponses de Gareth et @ Alex , si vous ne voulez pas vous embêter avec le système sous-jacent, vous pouvez utiliser psutil.

psutil est un module fournissant une interface pour récupérer des informations sur l'exécution des processus et système d'utilisation (CPU, mémoire) dans une manière portable en utilisant Python, mise en œuvre de nombreuses fonctionnalités offertes par les outils de ligne de commande comme ps, top, kill et gestionnaire de tâches Windows.

Il prend actuellement en charge Linux, OS X, FreeBSD et Windows avec les versions Python de 2,4 à 3,1 en utilisant une base de code unique.

4

Voilà une copie & pase solution complète:

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) 

Acceptant rapports de bugs que les commentaires;)

Questions connexes