gpt4 book ai didi

Python 3 TypeError : must be str, not bytes with sys.stdout.write()

转载 作者:IT老高 更新时间:2023-10-28 20:29:04 25 4
gpt4 key购买 nike

我正在寻找一种从 python 脚本运行外部进程并在执行期间打印其标准输出消息的方法。
下面的代码有效,但在运行时不打印标准输出。当它退出时,我收到以下错误:

sys.stdout.write(nextline) TypeError:must be str,not bytes

p = subprocess.Popen(["demo.exe"],stdout = subprocess.PIPE, stderr= subprocess.PIPE)    
# Poll process for new output until finished
while True:
nextline = p.stdout.readline()
if nextline == '' and p.poll() != None:
break
sys.stdout.write(nextline)
sys.stdout.flush()

output = p.communicate()[0]
exitCode = p.returncode

我正在使用 python 3.3.2

最佳答案

Python 3 处理字符串有点不同。最初只有一种类型字符串:str。当 unicode 在 90 年代获得关注时,新的 unicode 类型已添加以处理 Unicode,而不会破坏预先存在的代码1。这是实际上与 str 相同,但支持多字节。

在 Python 3 中有两种不同的类型:

  • bytes 类型。这只是一个字节序列,Python不知道关于如何将其解释为字符的任何信息。
  • str 类型。这也是一个字节序列,但是 Python 知道如何将这些字节解释为字符
  • 单独的 unicode 类型已被删除。 str 现在支持 unicode。

在 Python 2 中,隐式假设编码可能会导致很多问题;你最终可能会使用错误的编码,或者数据可能没有编码全部(例如,它是 PNG 图像)。
明确告诉 Python 使用哪种编码(或明确告诉它猜测)通常更好,更符合“Python哲学”的“explicit is better than implicit”。

此更改与 Python 2 不兼容,因为许多返回值已更改,导致像这样的微妙问题;这可能是主要原因Python 3 的采用非常缓慢。由于 Python 没有静态类型2不可能使用脚本自动更改它(例如捆绑的2to3).

  • 您可以使用 bytes('h€llo', 'utf-8')str 转换为 bytes;这应该生成 b'H\xe2\x82\xacllo'。请注意如何将一个字符转换为三个字节。
  • 您可以使用 b'H\xe2\x82\xacllo'.decode('utf-8')bytes 转换为 str .

当然,在您的情况下,UTF-8 可能不是正确的字符集,所以请确保使用正确的。

在您的特定代码中,nextline 的类型是 bytes,而不是 str,从 subprocess 读取 stdoutstdin 在 Python 3 中从 str 更改为字节。这是因为 Python 无法确定它使用的是哪种编码。它可能使用与 sys.stdin.encoding 相同的(您系统的编码),但不能确定。

你需要更换:

sys.stdout.write(nextline)

与:

sys.stdout.write(nextline.decode('utf-8'))

或者也许:

sys.stdout.write(nextline.decode(sys.stdout.encoding))

您还需要将 if nextline == '' 修改为 if nextline == b'' 因为:

>>> '' == b''
False

另见 Python 3 ChangeLog , PEP 358 , 和 PEP 3112 .


1 有一些巧妙的技巧可以用 ASCII 做,而用多字节字符集做不到;最著名的例子是“xor with space to switch case”(例如 chr(ord('a') ^ ord(' ')) == 'A')和“将第 6 位设置为制作一个控制字符”(例如 ord('\t') + ord('@') == ord('I'))。 ASCII 是在操作单个位是一项对性能影响不可忽略的操作时设计的。

2是的,你可以使用函数注解,但这是一个比较新的特性,很少使用。

关于Python 3 TypeError : must be str, not bytes with sys.stdout.write(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21689365/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com