有人可以解释为什么我想要的结果“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”
有人可以解释为什么我想要的结果“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'
如前所述,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()
将自行替换这些不需要的符号。
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
b 是字节表示,\n 是 echo 输出的结果。
以下将仅打印结果数据
import subprocess
print(subprocess.Popen("echo hi", shell=True,stdout=subprocess.PIPE).communicate()[0].decode('utf-8').strip())