I want to do subprocess.call, and get the output of the call into a string. Can I do this directly, or do I need to pipe it to a file, and then read from it?
In other words, can I somehow redirect stdout and stderr into a string?
I want to do subprocess.call, and get the output of the call into a string. Can I do this directly, or do I need to pipe it to a file, and then read from it?
In other words, can I somehow redirect stdout and stderr into a string?
This is an extension of mantazer's answer to python3. You can still use the subprocess.check_output command in python3:
>>> subprocess.check_output(["echo", "hello world"])
b'hello world\n'
however now it gives us a byte string. To get a real python string we need to use decode:
>>> subprocess.check_output(["echo", "hello world"]).decode(sys.stdout.encoding)
'hello world\n'
Using sys.stdout.encoding as the encoding rather than just the default UTF-8 should make this work on any OS (at least in theory).
The trailing newline (and any other extra whitespace) can be easily removed using .strip(), so the final command is:
>>> subprocess.check_output(["echo", "hello world"]
).decode(sys.stdout.encoding).strip()
'hello world'
No, you can't read the output of subprocess.call() directly into a string.
In order to read the output of a command into a string, you need to use subprocess.Popen(), e.g.:
>>> cmd = subprocess.Popen('ls', stdout=subprocess.PIPE)
>>> cmd_out, cmd_err = cmd.communicate()
cmd_out will have the string with the output of the command.
The subprocess module provides a method check_output() that runs the provided command with arguments (if any), and returns its output as a byte string.
output = subprocess.check_output(["echo", "hello world"])
print output
The code above will print hello world
See docs: https://docs.python.org/2/library/subprocess.html#subprocess.check_output
subprocess.call() takes the same arguments as subprocess.Popen(), which includes the stdout and stderr arguments. See the docs for details.
text=True in Python 3.7+In newer versions of Python, you can simply use text=True to get a string return value:
>>> import subprocess
>>> subprocess.check_output(["echo", "hello"], text=True)
'hello\n'
Here is what the docs say:
If
encodingorerrorsare specified, ortextis true, file objects for stdin, stdout and stderr are opened in text mode using the specifiedencodinganderrorsor theio.TextIOWrapperdefault. Theuniversal_newlinesargument is equivalent totextand is provided for backwards compatibility. By default, file objects are opened in binary mode.