2 votes

Pourquoi Popen.terminate() met-il fin à un sous-processus exécuté avec l'interpréteur de commandes (cmd.exe) sous Windows ?

Suppression du sous-processus créé avec shell=True transmis à subprocess.Popen Le constructeur de l'interpréteur de commandes sous Linux tue uniquement l'interpréteur de commandes et non le processus créé par l'interpréteur de commandes (cf. Comment terminer un sous-processus python lancé avec shell=True ). Toutefois, python -c "import subprocess; subprocess.Popen(['ping', '-t', 'google.com'], shell=True).terminate()" fonctionne sous Windows Vista x64 SP3 et Python 2.7.3 64bit tue la ping processus. Sous Windows subprocess.Popen.terminate() appelle TerminateProcess . Cependant documentation de cette fonction indique

Termine le processus spécifié et tous ses threads.

Il n'y a aucune mention de la fin de l'arbre de processus entier. Qu'est-ce que j'ai manqué ?

2voto

cdarke Points 8020

Je pense que c'est seulement avec la ligne unique que vous donnez, et mes observations suggèrent que la ping ne commence même pas. Si vous exécutez comme un script (Windows 7) :

import subprocess

proc = subprocess.Popen(['ping', '-t', 'google.com'], shell=True)

raw_input("<RETURN> to terminate")
proc.terminate()

raw_input("<RETURN> to end")

Ensuite, le proc.terminate() ne fait que terminer le shell, il fait pas mettre fin à la ping !

Cependant, si vous définissez shell=False alors il se comporte comme prévu - il met fin à l'exécution de la ping . Même comportement sur Python 2.7 et 3.2.

Edit : J'ai également essayé ce code en une ligne et j'ai obtenu les mêmes résultats que l'auteur de la question. Je déteste sleep mais ça, ça marche :

python -c "import subprocess,time;proc = subprocess.Popen(['ping','-t', 'google.com'], shell=True);time.sleep(1);proc.terminate()"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X