Python 3.6 Jupyter Notebook中恢复stdout失效问题求助
解决Jupyter中抑制第三方函数print后无法恢复stdout的问题
这个问题我在Jupyter环境里也碰到过,你的思路方向是对的,但问题出在Jupyter对stdout的特殊处理上——直接用sys.__stdout__恢复是行不通的,我来给你拆解原因和解决方案:
为什么原来的方法失效?
在Jupyter Notebook中,sys.stdout并不是系统原生的标准输出流(也就是sys.__stdout__指向的对象),而是Jupyter自己封装的一个输出流(比如IPython.utils.io.IOStream),用来把内容输出到Notebook的单元格里。当你执行sys.stdout = sys.__stdout__时,其实是把输出指向了系统级的stdout,而不是Jupyter正在使用的那个流,所以后续的print内容无法显示在Notebook中,只能重启内核重置。
两种可靠的解决方案
方案1:使用上下文管理器(推荐)
Python 3.4+自带了contextlib.redirect_stdout,这是最安全的临时重定向方式,它会自动帮你恢复原始流,完全不用手动操作:
import contextlib import os # 在with块内临时重定向stdout到/dev/null with contextlib.redirect_stdout(open(os.devnull, 'w')): x = myfunction() # 退出with块后,stdout自动恢复,后续输出正常显示 print("现在可以正常打印内容了!")
方案2:手动保存Jupyter当前的stdout
如果你不想用上下文管理器,也可以先保存Jupyter实际在用的sys.stdout,而不是用sys.__stdout__:
import sys import os # 保存Jupyter当前的输出流,这才是你需要恢复的对象 original_jupyter_stdout = sys.stdout # 重定向到/dev/null sys.stdout = open(os.devnull, 'w') x = myfunction() # 恢复之前保存的Jupyter输出流 sys.stdout = original_jupyter_stdout # 现在可以正常打印了 print("恢复成功!")
这两种方法都能避免破坏Jupyter的输出通道,不用重启内核就能正常恢复stdout功能。
内容的提问来源于stack exchange,提问作者Alexis Eggermont
相关产品推荐
相关产品推荐

