python-3.x 每次到stdout的打印都会失败,因为write声称它的输入是字节,而不是字符串

esbemjvw  于 2023-06-25  发布在  Python
关注(0)|答案(2)|浏览(151)

我试图调试一个模块,但每当我试图打印一些东西时,python 3.10就会停止,并显示以下错误:

File "/usr/lib/python3.10/codecs.py", line 378, in write
self.stream.write(data)
TypeError: write() argument must be str, not bytes

这个错误出现在我试图打印的任何地方,例如。print("abc")print(type(1))。在调用breakpoint()时也会发生这种情况,因为断点将其消息打印到stdout,但由于某种原因,stdout无法正常工作。
当在单独的python shell中调用print时,它可以工作,但当从脚本中加载的模块调用它时,它就不行了。
你知道这种行为是怎么回事吗?
尝试实际打印print(type(var))print(isinstance(var,bytes))的数据类型,但这导致相同的错误。

hts6caw3

hts6caw31#

data = b'abc'

string_data = data.decode('utf-8')

stream.write(string_data)
s8vozzvw

s8vozzvw2#

这个问题通常发生在你尝试像在python 2.x中那样设置stdout的默认编码时:

>>> import sys; import codecs
>>> sys.stdout = codecs.getwriter("utf-8")(sys.stdout)
>>> print("bla")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.5/codecs.py", line 377, in write
   self.stream.write(data)
TypeError: write() argument must be str, not bytes
>>> print(type("bla"))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.5/codecs.py", line 377, in write
  self.stream.write(data)
TypeError: write() argument must be str, not bytes

虽然有other ways to achieve this in Python 3.x,但在打印不表示字符串的二进制数据时,这可能会导致意外的副作用。因此,不使用强制解码方法可能是最安全的,而是在实际需要时显式调用decode

相关问题