如何在运行 IPython 的 Jupyter 中抑制输出?
Posted
技术标签:
【中文标题】如何在运行 IPython 的 Jupyter 中抑制输出?【英文标题】:How do you suppress output in Jupyter running IPython? 【发布时间】:2014-07-04 18:27:33 【问题描述】:如何抑制输出到stdout
?
分号可以用来禁止显示返回的对象,例如
>>> 1+1
2
>>> 1+1; # No output!
但是,打印到标准输出的函数不受分号的影响。
>>> print('Hello!')
Hello!
>>> MyFunction()
Calculating values...
如何抑制print
/ MyFunction
的输出?
【问题讨论】:
对于 iruby 内核只需添加nil
作为最后一行
【参考方案1】:
添加%%capture
作为单元格的第一行。例如
%%capture
print('Hello')
MyFunction()
这只是丢弃输出,但%%capture
魔法可用于将输出保存到变量 - consult the docs
【讨论】:
有人知道 %%capture 的反义词是什么吗?如,如何在单元格内停止 %%capture,或者在单元格结束之前启用它? 好消息是%%capture
仅在单元格末尾启用,并且它必须出现在单元格中的任何代码之前。 (所以似乎没有办法在单元格内取消捕获。)
ICYMI、@David Parks 和@Arel 的讨论在此页面上的@gwd2 的回答中涵盖了有关使用with io.capture_output() as captured:
的内容,您可以在单元格内进行微调以仅捕获在该with
中运行的内容上下文。
请注意,这只适用于 Python 内核(例如,不适用于 R)。【参考方案2】:
抑制输出
在行尾添加;
以禁止打印输出 [Reference]。
一个好的做法是始终从函数返回值,而不是在函数内打印值。在这种情况下,您可以控制;如果要打印返回值,可以;否则,它不会仅仅通过添加一个 ; 来打印。在函数调用之后。
【讨论】:
这不适用于for
循环内的代码。有任何想法吗?我只想抑制单元格中特定代码行的输出,而不是所有行。谢谢
此方法不适用于 jupyter notebook 上的 print()
。但是,1+1;
这样的代码可以工作。
也不适用于某些第 3 方组件;它似乎只抑制原生 python 标准输出。
你没看问题吗,他明确说他想要别的东西
其实jupyter不会打印变量的值,除非这是单元格的最后一条语句。如果它是最后一条语句,分号将按您提到的那样抑制输出。【参考方案3】:
(信用:https://***.com/a/23611571/389812)
你可以使用io.capture_output:
from IPython.utils import io
with io.capture_output() as captured:
MyFunction()
为with-statement
中的那些行抑制(例如捕获)stdout 和 stderr。
【讨论】:
非常感谢,这让我发疯了——我有一个启动函数,每次我打开一个调用%autosave
的笔记本时都会运行它,并想抑制它的输出。认为这很简单——但奇怪的是,contextlib.redirect_stdout
和 sys.stdout = open(os.devnull, 'w')
都失败了(最终打印了一个额外的空白行)。这应该是公认的答案。
这是我最喜欢的答案,因为可以在一个单元格中抑制 一些 输出而不抑制所有输出。
正是我想要的。
感谢您挽救了一条生命【参考方案4】:
如果有人有兴趣清除所有输出:
-
转到单元格
转到所有输出
然后选择您喜欢的任何选项。
【讨论】:
以上是关于如何在运行 IPython 的 Jupyter 中抑制输出?的主要内容,如果未能解决你的问题,请参考以下文章
iPython/Jupyter Notebook 和 Pandas,如何在 for 循环中绘制多个图?
如何从 Jupyter 4.x 获取 IPython 配置文件行为?
在 IPython/Jupyter Notebooks 中显示行号