如何在运行 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_stdoutsys.stdout = open(os.devnull, 'w') 都失败了(最终打印了一个额外的空白行)。这应该是公认的答案。 这是我最喜欢的答案,因为可以在一个单元格中抑制 一些 输出而不抑制所有输出。 正是我想要的。 感谢您挽救了一条生命【参考方案4】:

如果有人有兴趣清除所有输出:

    转到单元格 转到所有输出

然后选择您喜欢的任何选项。

【讨论】:

以上是关于如何在运行 IPython 的 Jupyter 中抑制输出?的主要内容,如果未能解决你的问题,请参考以下文章

iPython/Jupyter Notebook 和 Pandas,如何在 for 循环中绘制多个图?

如何从 Jupyter 4.x 获取 IPython 配置文件行为?

在 IPython/Jupyter Notebooks 中显示行号

Jupyter Notebook(iPython)

如何在 jupyter/ipython 笔记本中启用 MathJax Upgreek?

在 IPython (Jupyter) 中更改 Latex 输出的颜色