Disable console output from subprocess.Popen in Python
Question:
I run Python 2.5 on Windows, and somewhere in the code I have
subprocess.Popen("taskkill /PID " + str(p.pid))
to kill IE window by pid. The problem is that without setting up piping in Popen I still get output to console – SUCCESS: The process with PID 2068 has been terminated. I debugged it to CreateProcess in subprocess.py
, but can’t go from there.
Anyone knows how to disable this?
Answers:
fh = open("NUL","w")
subprocess.Popen("taskkill /PID " + str(p.pid), stdout = fh, stderr = fh)
fh.close()
from subprocess import check_call, DEVNULL, STDOUT
check_call(
("taskkill", "/PID", str(p.pid)),
stdout=DEVNULL,
stderr=STDOUT,
)
I always pass in tuples (or lists) to subprocess as it saves me worrying about escaping. check_call ensures (a) the subprocess has finished before the pipe closes, and (b) a failure in the called process is not ignored.
If you’re stuck in python 2, subprocess doesn’t provide DEVNULL. However, you can replicate it by opening os.devnull
(the standard, cross-platform way of saying NUL
in Python 2.4+):
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()
I run Python 2.5 on Windows, and somewhere in the code I have
subprocess.Popen("taskkill /PID " + str(p.pid))
to kill IE window by pid. The problem is that without setting up piping in Popen I still get output to console – SUCCESS: The process with PID 2068 has been terminated. I debugged it to CreateProcess in subprocess.py
, but can’t go from there.
Anyone knows how to disable this?
fh = open("NUL","w")
subprocess.Popen("taskkill /PID " + str(p.pid), stdout = fh, stderr = fh)
fh.close()
from subprocess import check_call, DEVNULL, STDOUT
check_call(
("taskkill", "/PID", str(p.pid)),
stdout=DEVNULL,
stderr=STDOUT,
)
I always pass in tuples (or lists) to subprocess as it saves me worrying about escaping. check_call ensures (a) the subprocess has finished before the pipe closes, and (b) a failure in the called process is not ignored.
If you’re stuck in python 2, subprocess doesn’t provide DEVNULL. However, you can replicate it by opening os.devnull
(the standard, cross-platform way of saying NUL
in Python 2.4+):
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()