You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 07:05:32