111

有人可以解释为什么我想要的结果“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”

4

4 回答 4

109

b表示您拥有的是,bytes它是字节的二进制序列,而不是 Unicode 字符的字符串。子进程输出字节,而不是字符,所以这communicate()就是返回的内容。

bytes类型不能直接print()使用,因此您会看到reprbytes拥有的类型。如果您知道从子进程收到的字节的编码,则可以使用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'
于 2013-03-12T23:33:50.767 回答
81

如前所述,echo hi实际上确实 return hi\n,这是一种预期的行为。

但是您可能只想以“正确”的格式获取数据,而不是处理编码。您需要做的就是通过universal_newlines=True选项来subprocess.Popen()喜欢这样:

>>> import subprocess
>>> print(subprocess.Popen("echo hi",
                           shell=True,
                           stdout=subprocess.PIPE,
                           universal_newlines=True).communicate()[0])
hi

这种方式Popen()将自行替换这些不需要的符号。

于 2018-02-20T08:42:44.590 回答
25

echo 命令默认返回换行符

与此比较:

print(subprocess.Popen("echo -n hi", \
    shell=True, stdout=subprocess.PIPE).communicate()[0])

至于字符串前面的b表示它是一个字节序列,相当于 Python 2.6+ 中的普通字符串

http://docs.python.org/3/reference/lexical_analysis.html#literals

于 2013-03-12T23:32:17.663 回答
11

b 是字节表示,\n 是 echo 输出的结果。

以下将仅打印结果数据

import subprocess
print(subprocess.Popen("echo hi", shell=True,stdout=subprocess.PIPE).communicate()[0].decode('utf-8').strip())
于 2017-06-24T15:26:09.030 回答