【问题标题】:error UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbe in position 2: invalid start byte错误UnicodeDecodeError:'utf-8'编解码器无法解码位置2的字节0xbe:无效的起始字节
【发布时间】:2021-03-05 00:08:10
【问题描述】:

我有一段代码可以做到这一点:

def command(self, s, level=1):
        sub=subprocess.Popen(s, bufsize=0, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True);
        (out, err) = sub.communicate()

我看到这个错误: UnicodeDecodeError:“utf-8”编解码器无法解码位置 2 中的字节 0xbe:无效的起始字节

当我尝试调用通信方法时。子进程 popen 正在读取为字符串。

在工作条件下它应该返回一个元组(stdoutdata,stderrdata)

【问题讨论】:

  • 寻求调试帮助的问题(“为什么这段代码不起作用?”)应包括所需的行为、特定问题或错误所需的最短代码作为格式化文本在问题本身中重现。没有明确的问题陈述的问题对其他读者没有用处。请参阅:minimal reproducible example
  • 向我们展示你是如何运行它的?默认情况下 subprocess.communicate() 返回字节,即它不会尝试解码它们。
  • 正如here 所提到的,当在 Python subprocess 中运行的程序将压缩数据块吐出到标准输出以及其他普通文本日志行时,我遇到了这种情况

标签: python python-3.x utf-8


【解决方案1】:

使用 universal_newlines=True 参数(自 Python 3.7 以来,它具有更易读的别名 text=True),输入和输出由 Python 隐式编码/解码。 您可以通过encoding= 参数告诉Python 使用哪个编解码器。 如果您不指定编解码器,则使用与io.TextIOWrapper 中相同的默认值。

默认编解码器取决于许多因素(操作系统、语言环境、Python 版本),但在您的情况下,它显然是 UTF-8。 但是,您的子进程返回 UTF-8 编码的数据。 所以你需要参考那个命令的文档:

  • 它是否在 Windows 代码页中返回文本,例如。 CP-1252?然后在subprocess.Popen 调用的encoding= 参数中指定这一点。
  • 它是否返回文本?如果不是,则省略universal_newlines 参数并处理作为bytes 对象返回的二进制数据。

【讨论】:

    猜你喜欢
    • 2021-10-22
    • 1970-01-01
    • 2017-07-09
    • 2018-01-16
    • 2021-12-01
    • 2016-05-13
    • 2017-05-03
    • 2020-02-06
    相关资源
    最近更新 更多