有人可以解释为什么结果我想,“喜”,前面带有一个字母“B”,随后以新行?
我使用Python 3.3
>>> import subprocess
>>> print(subprocess.Popen("echo hi", shell=True,
stdout=subprocess.PIPE).communicate()[0])
b'hi\n'
这种额外的“B”如果我使用Python 2.7运行它不会出现
有人可以解释为什么结果我想,“喜”,前面带有一个字母“B”,随后以新行?
我使用Python 3.3
>>> import subprocess
>>> print(subprocess.Popen("echo hi", shell=True,
stdout=subprocess.PIPE).communicate()[0])
b'hi\n'
这种额外的“B”如果我使用Python 2.7运行它不会出现
默认情况下,echo命令返回一个换行符
与此比较:
print(subprocess.Popen("echo -n hi", \
shell=True, stdout=subprocess.PIPE).communicate()[0])
作为字符串前面的B则表明它是被equivilent在Python一个正常的字符串的字节序列2.6+
http://docs.python.org/3/reference/lexical_analysis.html#literals
该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'
正如前面提到的, echo hi
实际上没有返回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()
将自行更换这些不必要的符号。
b为字节表示和\ n是回声输出的结果。
下面,只打印结果数据
import subprocess
print(subprocess.Popen("echo hi", shell=True,stdout=subprocess.PIPE).communicate()[0].decode('utf-8').strip())