En Python 2.5, comment puis-je tuer un sous-processus?
-
21-08-2019 - |
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.
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;)