Question

J'utilise le paquet de sous-processus en Python pour exécuter un sous-processus, que je dois tuer plus tard. Cependant, la documentation du paquet subprocess indique que la fonction fin () est disponible à partir de 2.6

Nous courons Linux avec 2,5 et pour des raisons de compatibilité en arrière, je ne peux pas mettre à niveau vers 2.6, quelle est l'alternative? Je suppose que ces fonctions sont des méthodes de commodité pour quelque chose.

Était-ce utile?

La solution

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 sont hors de la chance.

Autres conseils

Pour compléter la réponse de @ Gareth, sur Windows-vous:

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 pas; -)

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

  

psutil est un module fournissant un   interface pour la récupération d'informations   sur les processus en cours d'exécution et le système   utilisation (CPU, mémoire) dans un   manière portable en utilisant Python,   la mise en œuvre de nombreuses fonctionnalités   offert par les outils de ligne de commande comme ps,   haut, tuer et gestionnaire de tâches de Windows.

     

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

Cest une solution complète copie et 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)

Accepter des rapports de bugs que les commentaires;)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top