Отключить вывод консоли из подпроцесса. Открыть в Python - PullRequest
8 голосов
/ 07 августа 2009

Я запускаю Python 2.5 в Windows, и где-то в коде у меня есть

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

чтобы убить окно IE с помощью pid. Проблема в том, что без настройки конвейера в Popen я все еще получаю вывод на консоль - УСПЕХ: Процесс с PID 2068 был завершен. Я отладил его до CreateProcess в subprocess.py, но оттуда не могу идти.

Кто-нибудь знает, как это отключить?

Ответы [ 2 ]

12 голосов
/ 07 августа 2009
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()

Я всегда передаю кортежи подпроцессам, так как это избавляет меня от беспокойства о побеге. check_call гарантирует (a), что подпроцесс завершил до , когда канал закрывается, и (b) сбой в вызываемом процессе не игнорируется. Наконец, os.devnull - это стандартный кроссплатформенный способ сказать NUL в Python 2.4 +.

Обратите внимание, что в Py3K подпроцесс предоставляет вам DEVNULL, поэтому вы можете просто написать:

from subprocess import check_call, DEVNULL, STDOUT

check_call(("taskkill", "/PID", str(p.pid)), stdout=DEVNULL, stderr=STDOUT)
7 голосов
/ 07 августа 2009
fh = open("NUL","w")
subprocess.Popen("taskkill /PID " + str(p.pid), stdout = fh, stderr = fh)
fh.close()
...