To answer the question based on its title in the most generic form:
To suppress all output from os.system()
, append >/dev/null 2>&1
to the shell command, which silences both stdout and stderr; e.g.:
import os
os.system('echo 3 | sudo tee /proc/sys/vm/drop_caches >/dev/null 2>&1')
Note that os.system()
by design passes output from the calling process' stdout and stderr streams through to the console (terminal) - your Python code never sees them.
Also, os.system()
does not raise an exception if the shell command fails and instead returns an exit code; note that it takes additional work to extract the shell command's true exit code: you need to extract the high byte from the 16-bit value returned, by applying >> 8
(although you can rely on a return value other than 0
implying an error condition).
Given the above limitations of os.system()
, it is generally worthwhile to use the functions in the subprocess
module instead:
For instance, subprocess.check_output()
could be used as follows:
import subprocess
subprocess.check_output('echo 3 | sudo tee /proc/sys/vm/drop_caches', shell=True)
The above will:
- capture stdout output and return it (with the return value being ignored in the example above)
- pass stderr output through; passing
stderr=subprocess.STDOUT
as an additional argument would also capture stderr.
- raise an error, if the shell command fails.
Note: Python 3.5 introduced subprocess.run()
, a more flexible successor to both os.system()
and subprocess.check_output()
- see https://docs.python.org/3.5/library/subprocess.html#using-the-subprocess-module
Note:
- The reason that the OP is employing
tee
in the first place - despite not being interested in stdout output - is that a na?ve attempt to use > ...
instead would be interpreted before sudo
is invoked, and thus fail, because the required privileges to write to /proc/sys/...
haven't been granted yet.
- Whether you're using
os.system()
or a subprocess
function, stdin is not affected by default, so if you're invoking your script from a terminal, you'll get an interactive password prompt when the sudo
command is encountered (unless the credentials have been cached).
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…