python3.6 - TypeError: write() argument must be str, not bytes - but no files involved

python3.6 - TypeError: write() argument must be str, not bytes - but no files involved

以下代码 returns 一个错误,我不明白为什么... 运行 在 Python 3.6

import subprocess
import sys
import os

def execute_shell_cmd(cmd):
        process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
        for c in iter(lambda: process.stdout.read(1), b''):
                sys.stdout.write(c)
        for e in iter(lambda: process.stderr.read(1), b''):
                sys.stderr.write(e)

execute_shell_cmd("ls -l")

返回错误: TypeError: write() 参数必须是 str,而不是 bytes

我在网上看到的所有内容都在谈论文件并使用 'wb' 选项打开它们,但这与这里无关。

我确定这很傻... 有什么想法吗?

您在没有设置编码参数的情况下打开子进程,因此流是二进制流(这是一个非常合理的默认设置,考虑到例如 GhostScript 之类的东西可以在 stdout 上输出二进制 PDF)。

process = subprocess.Popen(
   cmd,
   stdout=subprocess.PIPE, 
   stderr=subprocess.PIPE,
   shell=True,
   encoding='utf-8',
   errors='strict',   # could be ignore or replace too, `strict` is the default
)

如果您希望将流包装在 UTF-8 解码器中,以便从中获取字符串,而不是字节。当然,这意味着您知道输出数据始终是 UTF-8。