Can someone explain why the result I want, "hi", is preceded with a letter 'b' and followed with a newline?
I am using Python 3.3
>>> import subprocess
>>> print(subprocess.Popen("echo hi", shell=True,
stdout=subprocess.PIPE).communicate()[0])
b'hi\n'
This extra 'b' does not appear if I run it with python 2.7
The
b
indicates that what you have isbytes
, which is a binary sequence of bytes rather than a string of Unicode characters. Subprocesses output bytes, not characters, so that's whatcommunicate()
is returning.The
bytes
type is not directlyprint()
able, so you're being shown therepr
of thebytes
you have. If you know the encoding of the bytes you received from the subprocess, you can usedecode()
to convert them into a printablestr
:Of course, this specific example only works if you actually are receiving ASCII from the subprocess. If it's not ASCII, you'll get an exception:
The newline is part of what
echo hi
has output.echo
's job is to output the parameters you pass it, followed by a newline. If you're not interested in whitespace surrounding the process output, you can usestrip()
like so:As mentioned before,
echo hi
actually does returnhi\n
, which it is an expected behavior.But you probably want to just get the data in a "right" format and not deal with encoding. All you need to do is pass
universal_newlines=True
option tosubprocess.Popen()
like so:This way
Popen()
will replace these unwanted symbols by itself.The echo command by default returns a newline character
Compare with this:
As for the b preceding the string it indicates that it is a byte sequence which is equivilent to a normal string in Python 2.6+
http://docs.python.org/3/reference/lexical_analysis.html#literals
b is the byte representation and \n is the result of echo output.
Following will print only the result data