2009-08-07 9 views
8

-je utiliser Python 2.5 sous Windows, et quelque part dans le code jesortie de la console Désactiver de subprocess.Popen en Python

subprocess.Popen("taskkill /PID " + str(p.pid)) 

tuer fenêtre IE par pid. Le problème est que sans mettre en place la tuyauterie dans Popen je reçois toujours la sortie à la console - SUCCESS: Le processus avec PID 2068 a été terminé. J'ai débogué à CreateProcess dans subprocess.py, mais ne peut pas partir de là.

Quelqu'un sait comment désactiver cela?

+0

Quel est le problème avec subprocess.Popen ("taskkill/PID" + str (p.pid) + " > NUL ")? –

+0

Peut-être parce que python fonctionne sur Windows? Il est dit que '>' n'est pas une option valide de la commande taskkill –

+1

J'ai essayé cela en premier, pour une raison quelconque, il ne l'analyse pas correctement. >>> ERREUR: argument/option invalide - '>'. Type "TASKKILL /?" pour l'usage. Cela fonctionne sur la ligne cmd cependant. – Mark

Répondre

7
fh = open("NUL","w") 
subprocess.Popen("taskkill /PID " + str(p.pid), stdout = fh, stderr = fh) 
fh.close() 
+0

Merci! Cette pièce fonctionne réellement. J'ai complètement oublié NUL. –

+3

Je pense qu'il existe une condition de concurrence: vous pouvez fermer le canal avant la fin de votre sous-processus et l'interrompre prématurément. –

+0

@chrispy - vous avez raison, je pense qu'il devrait y avoir un .communicate() – orip

11
import os 
from subprocess import check_call, STDOUT 

DEVNULL = open(os.devnull, 'wb') 
try: 
    check_call(("taskkill", "/PID", str(p.pid)), stdout=DEVNULL, stderr=STDOUT) 
finally: 
    DEVNULL.close() 

Je passe toujours à tuples comme il me Subprocess sauve se soucier de s'échapper. check_call s'assure que (a) le sous-processus a fini avant que le tuyau se ferme, et (b) une défaillance dans le processus appelé n'est pas ignorée. Enfin, os.devnull est la manière standard, multiplate-forme, de dire NUL dans Python 2.4+.

Notez que dans Py3K, fournit des sous-processus devnull pour vous, vous pouvez simplement écrire:

from subprocess import check_call, DEVNULL, STDOUT 

check_call(("taskkill", "/PID", str(p.pid)), stdout=DEVNULL, stderr=STDOUT)