2009-08-07 21 views
8

Puedo ejecutar Python 2.5 en Windows, y en alguna parte del código que tengosalida de la consola Desactivar en subprocess.Popen en Python

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

para matar ventana de IE por pid. El problema es que sin configurar la tubería en Popen todavía obtengo salida a la consola - ÉXITO: ​​El proceso con PID 2068 ha finalizado. Lo depuré a CreateProcess en subprocess.py, pero no puedo ir desde allí.

¿Alguien sabe cómo deshabilitar esto?

+0

¿Cuál es el problema con subprocess.Popen ("taskkill/PID" + str (p.pid) + " > NUL ")? –

+0

¿Tal vez porque Python se ejecuta en Windows? Dice que '>' no es una opción válida del comando taskkill –

+1

Lo intenté primero, por alguna razón no se analiza correctamente. >>> ERROR: Argumento/opción no válida - '>'. Tipo "TASKKILL /?" para el uso Eso funciona en la línea de cmd sin embargo. – Mark

Respuesta

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

¡Gracias! Esta pieza realmente funciona. Me olvidé por completo de NUL. –

+3

Creo que hay una condición de carrera allí: puede cerrar la tubería antes de que haya finalizado su subproceso y hacer que finalice antes. –

+0

@chrispy: está en lo correcto, creo que debería haber un .communicate() allí – 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() 

Siempre pase en tuplas para el subproceso ya que me ahorra tener que preocuparse acerca de escapar. check_call asegura que (a) el subproceso finalizó antes de el tubo se cierra, y (b) no se ignora una falla en el proceso llamado. Finalmente, os.devnull es la forma estándar, multiplataforma de decir NUL en Python 2.4+.

Nótese que en Py3K, subproceso proporciona Devnull para usted, por lo que se acaba de escribir:

from subprocess import check_call, DEVNULL, STDOUT 

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