2009-08-07 15 views
8

uruchomić Pythona 2.5 na Windows i gdzieś w kodzie mamWyłącz wyjścia konsoli z subprocess.Popen w Pythonie

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

zabić IE okno przez PID. Problem polega na tym, że bez instalowania potoków w Popen nadal otrzymuję wyjście do konsoli - SUKCES: Proces z PID 2068 został zakończony. I debugowałem go do CreateProcess w subprocess.py, ale nie można stamtąd.

Ktoś wie, jak to wyłączyć?

+0

Jaki jest problem z subprocess.Popen ("taskkill/PID" + str (p.pid) + " > NUL ")? –

+0

Może dlatego, że python działa w systemie Windows? Mówi, że ">" nie jest poprawną opcją polecenia taskkill –

+1

Najpierw spróbowałem tego, z jakiegoś powodu nie parsuje się poprawnie. >>> BŁĄD: Nieprawidłowy argument/opcja - ">". Wpisz "TASKKILL /?" do użytku. Działa to jednak na linii cmd. – Mark

Odpowiedz

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

Dziękujemy! Ten kawałek faktycznie działa. Całkowicie zapomniałem o NUL. –

+3

Myślę, że jest tam wyścigowy stan - możesz zamknąć rurę przed zakończeniem podprocesu i spowodować jej wcześniejsze zakończenie. –

+0

@ chrispy - masz rację, myślę, że powinna tam być .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() 

zawsze przechodzą w krotek do podproces gdyż oszczędza mi się martwić o ucieczce. check_call zapewnia (a) zakończenie podprocesu przed zamknięciem rury przez oraz (b) niepowodzenie w wywołanym procesie nie jest ignorowane. Wreszcie, os.devnull jest standardowym, międzyplatformowym sposobem wymawiania NUL w Pythonie 2.4+.

Należy zauważyć, że w Py3K, podproces zapewnia DEVNULL dla ciebie, więc można po prostu napisać:

from subprocess import check_call, DEVNULL, STDOUT 

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