首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Popen.communicate()抛出UnicodeDecodeError

Popen.communicate()抛出UnicodeDecodeError
EN

Stack Overflow用户
提问于 2015-04-09 18:34:44
回答 4查看 7.3K关注 0票数 4

我有这样的代码:

代码语言:javascript
复制
def __executeCommand(self, command: str, input: str = None) -> str:
    p = sub.Popen(command, stdout=sub.PIPE, stderr=sub.PIPE, stdin=sub.PIPE, universal_newlines=True)
    p.stdin.write(input)
    output, error = p.communicate()
    if (len(errors) > 0):
        raise EnvironmentError("Could not generate the key: " + error)
    elif (p.returncode != 0):
        raise EnvironmentError("Could not generate the key. Return Value: " + p.returncode)
    return output

我在行中得到一个UnicodeDecodeError,output, error = p.communicate()

代码语言:javascript
复制
Traceback (most recent call last):
  File "C:\Python34\lib\threading.py", line 921, in _bootstrap_inner
    self.run()
  File "C:\Python34\lib\threading.py", line 869, in run
    self._target(*self._args, **self._kwargs)
  File "C:\Python34\lib\subprocess.py", line 1170, in _readerthread
    buffer.append(fh.read())
  File "C:\Python34\lib\encodings\cp1252.py", line 23, in decode
    return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 27: character maps to <undefined>

我怎么才能解决这个问题?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-04-10 23:37:06

univeral_newlines=True启用文本模式。子进程输出(字节)使用locale.getpreferredencoding(False)字符编码作为@cdosborn进行解码。

如果不起作用,请提供command使用的实际command。和/或将错误处理程序(如 )指定为errors参数:

代码语言:javascript
复制
from subprocess import Popen, PIPE

def __executeCommand(self, command: str, input: str = None, 
                     encoding=None, errors='strict') -> str:
    text_mode = (encoding is None)
    with Popen(command, stdout=PIPE, stderr=PIPE, stdin=PIPE,
               universal_newlines=text_mode) as p:
        if input is not None and not text_mode:
            input = input.encode(encoding, errors) # convert to bytes
        output, err = p.communicate(input)
    if err or p.returncode != 0: 
        raise EnvironmentError("Could not generate the key. "
                               "Error: {}, Return Value: {}".format(
                                   ascii(err), p.returncode))
    return output if text_mode else output.decode(encoding, errors)
票数 4
EN

Stack Overflow用户

发布于 2018-10-15 19:49:06

如果您使用的是Python3.6或更高版本,则可以通过更改以下行来修复此错误:

代码语言:javascript
复制
p = sub.Popen(command, stdout=sub.PIPE, stderr=sub.PIPE, stdin=sub.PIPE, universal_newlines=True)

对此:

代码语言:javascript
复制
p = sub.Popen(command, stdout=sub.PIPE, stderr=sub.PIPE, stdin=sub.PIPE, encoding="utf-8", universal_newlines=True)

我使用了上面的UTF-8,但是你可以用你需要的任何编码来代替它。

票数 3
EN

Stack Overflow用户

发布于 2015-04-09 21:00:44

universal_newlines=true设置会导致额外的编码,这是错误的来源。

代码语言:javascript
复制
def __executeCommand(self, command: str, input: str = None) -> str:
    p = sub.Popen(command, stdout=sub.PIPE, stderr=sub.PIPE, stdin=sub.PIPE)
    output, error = p.communicate(input)
    if (len(errors) > 0):
        raise EnvironmentError("Could not generate the key: " + error)
    elif (p.returncode != 0):
        raise EnvironmentError("Could not generate the key. Return Value: " + p.returncode)
    return output

universal_newlines=true基于以下输出产生编码:

python -c 'import locale; print locale.getpreferredencoding()'

当Python期望输入与上面的编码匹配时,它会抛出一个错误,但是相反,它用不同的编码清楚地处理了一个字节。

有关python3.4universal_newlines 这里的更多信息。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29546311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档