2009-08-07 11 views
8

Ich betreiben Python 2.5 auf Windows, und irgendwo im Code ich habeDisable Konsolenausgabe von subprocess.Popen in Python

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

von pid IE-Fenster zu töten. Das Problem ist, dass ich, ohne das Piping in Popen einzurichten, trotzdem eine Ausgabe an die Konsole bekomme - SUCCESS: Der Prozess mit PID 2068 wurde beendet. Ich habe es in CreateProcess in subprocess.py getestet, kann aber nicht von dort gehen.

Wer weiß, wie man das deaktiviert?

+0

Was ist das Problem mit subprocess.Popen ("taskkill/PID" + str (p.pid) + " > NUL ")? –

+0

Vielleicht, weil Python unter Windows läuft? Es besagt, dass '>' keine gültige Option des Taskkill-Befehls ist –

+1

Ich habe das zuerst versucht, aus irgendeinem Grund wird es nicht korrekt analysiert. >>> FEHLER: Ungültiges Argument/Option - '>'. Typ "TASKKILL /?" zur Verwendung. Das funktioniert jedoch auf der CMD-Linie. – Mark

Antwort

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

Danke! Dieses Stück funktioniert tatsächlich. Ich habe NUL völlig vergessen. –

+3

Ich denke, da ist eine Race-Bedingung - du kannst die Pipe schließen, bevor dein Subprozess beendet ist und ihn vorzeitig beenden. –

+0

@chrispy - Sie sind richtig, ich denke, es sollte eine. Communicate() drin sein – 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() 

ich in Tupeln passieren immer auf Teilprozess, wie es mir zu entkommen Sorgen erspart. check_call stellt sicher (a) der Subprozess ist beendet vor die Pipe schließt, und (b) ein Fehler im aufgerufenen Prozess wird nicht ignoriert. Schließlich ist os.devnull der standardmäßige, plattformübergreifende Weg, in Python 2.4+ NUL zu sagen.

Beachten Sie, dass in py3k, subprocess bietet devnull für Sie, so können Sie einfach schreiben:

from subprocess import check_call, DEVNULL, STDOUT 

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