有人能解释一下为什么我想要的结果“hi”前面有一个字母“b”,后面有一个换行符吗?
我正在使用 Python 3.3
>>> import subprocess
>>> print(subprocess.Popen("echo hi", shell=True,
stdout=subprocess.PIPE).communicate()[0])
b'hi\n'
如果我使用 python 2.7 运行它,则不会出现这个额外的“b”
最佳答案
b
表示你拥有的是 bytes
,它是字节的二进制序列,而不是 Unicode 字符的字符串。子进程输出字节,而不是字符,这就是 communicate()
正在回归。
bytes
类型不是直接print()
能,所以你会看到repr
的bytes
你有。如果您知道从子进程收到的字节的编码,则可以使用 decode()
将它们转换为可打印的 str
:
>>> print(b'hi\n'.decode('ascii'))
hi
当然,此特定示例仅在您实际从子进程接收 ASCII 时才有效。如果不是 ASCII,你会得到一个异常:
>>> print(b'\xff'.decode('ascii'))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xff in position 0…
换行符是 echo hi
的一部分有输出。 echo
的工作是输出你传递给它的参数,后跟换行符。如果您对进程输出周围的空白不感兴趣,可以使用 strip()
像这样:
>>> b'hi\n'.strip()
b'hi'
关于python - 为什么 Popen.communicate() 返回 b'hi\n' 而不是 'hi' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15374211/