python - 为什么 Popen.communicate() 返回 b'hi\n' 而不是 'hi' ?

标签 python subprocess popen

有人能解释一下为什么我想要的结果“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()能,所以你会看到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'

关于python - 为什么 Popen.communicate() 返回 b'hi\n' 而不是 'hi' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15374211/

相关文章:

python - 杀死使用 Python 的 subprocess.Popen() 创建的进程

python - 如何使用 python OpenCV 缩放图像中字符的粗细?

Python - 在 Windows 上运行一个带有提示 I/O 和 "proxy"的简单命令行程序

lua - io.popen() :lines() ignores first non-empty line

Python subprocess.check_call - 如何将 stdout 和 stderr 定向到_bo​​th_ 屏幕和日志文件?

python - 在 Python-Subprocess 中运行连续的 Shell 命令

Python:使用参数(变量)执行 shell 脚本,但参数未在 shell 脚本中读取

Python boto - 如何获取弹性 ip 的分配 id

python - 序列化 C++ 对象以通过套接字发送到 Python - 最佳方法?

python - Windows Azure 虚拟机 : Connection Timeout to Remote MySQL Database