Python 3.10中print输出报错:write()参数应为str而非bytes
问题描述
调试Python 3.10模块时,执行print输出或调用breakpoint()都会触发如下错误:
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一切正常,但在脚本加载的模块里调用就失败
可能原因与解决方法
1. stdout被替换为字节流
Python的print默认会把字符串编码后写入文本流,但如果模块里修改了sys.stdout,将其替换成字节流对象(比如BytesIO),就会触发这个错误——字节流只接受bytes类型数据,而print输出的是str类型。
解决:
- 检查模块内是否有修改
sys.stdout的代码,比如这类错误写法:import sys from io import BytesIO sys.stdout = BytesIO() - 若需要重定向输出,改用文本流
StringIO:import sys from io import StringIO sys.stdout = StringIO() - 若无需重定向,直接恢复默认标准输出:
import sys sys.stdout = sys.__stdout__
2. 编码处理逻辑冲突
部分第三方库或自定义代码,可能错误地给stdout套了编码包装器,导致codecs模块传递了错误类型的数据。比如把文本流当成字节流处理,或编码方向搞反。
解决:
- 检查模块内是否有
codecs.getwriter这类修改stdout的代码,确保编码处理的是文本流:import sys import codecs # 错误示例:给文本流套字节编码写入器 sys.stdout = codecs.getwriter('utf-8')(sys.stdout.buffer) # 正确做法(如需自定义编码) sys.stdout = codecs.getwriter('utf-8')(sys.stdout) - 可以先注释掉所有修改stdout或编码的代码,逐步排查哪段代码引发问题。
3. 启动环境异常
如果脚本通过特定参数或环境变量启动,可能导致Python将stdout初始化为字节流。比如系统层面的输出重定向,或设置了异常的环境变量。
解决:
- 直接用
python3 your_module.py运行脚本,不加任何额外参数或重定向,验证是否还报错。 - 检查
PYTHONIOENCODING环境变量,确保其值为合法的文本编码(如utf-8),而非字节相关设置。
内容的提问来源于stack exchange,提问作者Andi AA
相关产品推荐
相关产品推荐

