2009-08-07 8 views
8

ho eseguito Python 2.5 su Windows, e in qualche parte del codice che hodisattivare l'uscita della console da subprocess.Popen in Python

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

di uccidere finestra di IE da pid. Il problema è che senza aver configurato le tubazioni in Popen ho ancora l'output in console - SUCCESSO: il processo con PID 2068 è stato terminato. Ho eseguito il debug su CreateProcess in subprocess.py, ma non posso andare da lì.

Qualcuno sa come disabilitare questo?

+0

Qual è il problema con la subprocess.Popen ("taskkill/PID" + str (p.pid) + " > NUL ")? –

+0

Forse perché Python gira su Windows? Dice che '>' non è un'opzione valida del comando taskkill –

+1

L'ho provato prima, per qualche motivo non viene analizzato correttamente. >>> ERRORE: argomento/opzione non valido - '>'. Digita "TASKKILL /?" per l'uso. Questo funziona comunque sulla linea cmd. – Mark

risposta

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

Grazie! Questo pezzo funziona davvero. Mi sono completamente dimenticato di NUL. –

+3

Penso che ci sia una condizione di competizione lì - puoi chiudere il tubo prima che il sottoprocesso abbia finito e farlo terminare in anticipo. –

+0

@chrispy - sei corretto, penso che ci dovrebbe essere un .communicate() in là – 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() 

ho sempre passare in tuple per sottoprocesso e fa risparmiare me preoccuparsi di fuga. check_call garantisce (a) il sottoprocesso ha terminato prima del il pipe si chiude e (b) un errore nel processo chiamato non viene ignorato. Infine, os.devnull è il modo standard e multipiattaforma di dire NUL in Python 2.4+.

Si noti che in Py3K, sottoprocesso prevede devnull per voi, in modo da poter basta scrivere:

from subprocess import check_call, DEVNULL, STDOUT 

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