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

为何Python的sys.__stdout__默认情况下等于None?

问题

我照着Python书籍里的输出重定向示例操作,先把sys.stdout改成了文件对象,之后想恢复成sys.__stdout__,结果恢复后后续代码的输出完全看不到。通过下面的交互发现了问题:

>>> import sys
>>> sys.stdout
<idlelib.run.StdOutputFile object at 0x00000191D0BCFB50>
>>> sys.__stdout__
>>> print(sys.__stdout__)
None
>>> 

想问问:为什么默认情况下sys.__stdout__等于None?注:我知道contextlib里的上下文管理器方法,但就是想搞懂这个现象的原因。

原因分析

这是因为你是在IDLE环境里运行代码导致的。

在标准的Python命令行解释器(直接在终端敲python启动的环境)中,sys.__stdout__会被初始化为程序启动时的原始标准输出流,用来保存sys.stdout的初始状态,方便后续恢复。

但IDLE的代码执行逻辑不一样:它会在子进程中运行你的代码,并且idlelib.run模块在替换标准输出流(把sys.stdout改成idlelib.run.StdOutputFile对象,用来把输出显示到IDLE窗口)的时候,并没有将原始的标准输出流赋值给sys.__stdout__,所以这个变量就保持了默认的None值。

当你把sys.stdout改成sys.__stdout__(也就是None)后,后续输出没有有效的输出流,自然就看不到任何内容了。

内容的提问来源于stack exchange,提问作者baronch

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 01:50:48