Fabric: 调用带Unicode u'\ xff'的puts函数且stream.encoding为None时的UnicodeEncodeError

创建于 2015-04-08  ·  5评论  ·  资料来源: fabric/fabric

你好,
当将变量s替换为另一个值u'\ xff'时,此测试将失败。

[测试用例]

@mock_streams('stdout')
def test_puts_with_encoding_type_none_output():
    """
    puts() should print unicode output without a stream encoding
    """
    s = u"string!"       #<====== replace to u"\xff"
    output.user = True
    sys.stdout.encoding = None
    puts(s, show_prefix=False)
    eq_(sys.stdout.getvalue(), s + "\n")

[追溯]
UnicodeEncodeError:'ascii'编解码器无法在位置0-4处编码字符:序数不在范围内(128)

[注释]
有问题的点位于utils.py中的函数“ _encode”中,您不应简单地通过使用str(msg)将味精转换为str。

def _encode(msg, stream):
    if isinstance(msg, unicode) and hasattr(stream, 'encoding') and not stream.encoding is None:
        return msg.encode(stream.encoding)
    else:
        return str(msg)         #<========== buggy point
Bug Needs investigation Needs patch

最有用的评论

有人在乎吗?

所有5条评论

有人在乎吗?

是的,将return str(msg)更改return msg似乎可以解决问题,而无需中断测试。 但是,为什么首先需要进行此演员表转换?

我不确定现在更改此设置是否有意义。 它不会绝对破坏任何人的代码,但基本上可以让您puts不是字符串的东西,并且可以得到一些有意义的东西:

>>> class Foo(object):
...   def __str__(self): return "The best Foo in the world"
...
>>> from fabric.api import puts
>>> puts(Foo())
The best Foo in the world

我猜那里有使用此代码(不希望在github中搜索此代码,因此不要尝试查找示例)。

我不确定我是否认为没有编码集并使用unicode会导致puts使我们崩溃是正确的。

现在,解决这个问题的最糟糕的方法就是简单地将有问题的行扩展到此块中:

try:
    return str(msg) # Original behavior added for 'reasons'
except UnicodeDecodeError:
    return msg # Best-effort fallback

这样,无论我们出于何种原因将字符串转换为字符串,都将继续起作用,但是讨论中的越野车案例将退回到“好吧,我不知道这是什么,但是我不能str()它,因此我将其按原样推入管道”。

我在运行sudo方法时遇到了类似的问题,该异常发生在self.stream.write(text)中的io.py 。 在unicode问题上有什么进展吗?

此页面是否有帮助?
0 / 5 - 0 等级