有没有更好的方法使用unicode_literals从Python子流程管道中检索字符串?

时间:2014-12-31 15:45:24

标签: python subprocess python-unicode

另一个问题是如何在使用unicode_literals时将字节字符串传递给subprocess.Popen到stdin。 How to fix an encoding migrating Python subprocess to unicode_literals?。答案解决了问题,并在收集子流程时发出了警告。 stdout字符串。

仍在使用:

from future import unicode_literals

最初,我在收集stdout时收到了相同的UnicodeDecodeError错误。所以!使用我的新知识,我在一个单独的线程中更新了服务stdout的接收代码:

for text in iter(popen.stdout.readline,''):
    text = text.decode(encoding)
    text = text.strip(' \r\n')

这解决了错误,但出现了一个新警告:

test.py:456: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
  for text in iter(popen.stdout.readline,''):

通过一点搜索,我发现我可以像这样压制警告信息:

with warnings.catch_warnings():
    warnings.simplefilter("ignore")
    for text in iter(popen.stdout.readline,''):
        text = text.decode('utf-8')
        text = text.strip(' \r\n')

问题:有没有办法解决不匹配或抑制处理此问题的最佳方法?

1 个答案:

答案 0 :(得分:1)

popen.stdout.readline返回一个字节字符串,而不是Unicode字符串;但是你要将它与Unicode字符串''进行比较。使用b''相反,它应该更好地工作(没有抑制有用的警告! - ):

for text in iter(popen.stdout.readline, b''):