I am calling this piece of code, but it produces some output in the console where I ran the python script (due to tee command):
os.system("echo 3 | sudo tee /proc/sys/vm/drop_caches")
This version does not produce console output but is there another way?
os.system('sudo bash -c "echo 3 > /proc/sys/vm/drop_caches"')
Write directly to the proc pseudo file instead via Python i/o lib.
This will require your script to run as root (via
sudo
), which means you should limit its scope to being an admin only tool. This also allows the script to run on boxes wheresudo
requires a password.Example:
You also can use this simple method of subprocess module.
All outputs will be passed to DEVNULL. Any issues with the command will be reported by an exception. No issues means no output.
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.:Note that
os.system()
by design passes output through to the calling process' stdout and stderr streams - 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 than0
implying an error condition).Given the above limitations of
os.system()
, it is generally worthwhile to use the functions in thesubprocess
module instead:For instance,
subprocess.check_output()
could be used as follows:The above will:
stderr=subprocess.STDOUT
as an additional argument would also capture stderr.Note: Python 3.5 introduced
subprocess.run()
, a more flexible successor to bothos.system()
andsubprocess.check_output()
- see https://docs.python.org/3.5/library/subprocess.html#using-the-subprocess-moduleNote:
tee
in the first place - despite not being interested in stdout output - is that a naïve attempt to use> ...
instead would be interpreted beforesudo
is invoked, and thus fail, because the required privileges to write to/proc/sys/...
haven't been granted yet.os.system()
or asubprocess
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 thesudo
command is encountered (unless the credentials have been cached).