在运行IPython的Jupyter中如何抑制输出?

197
如何抑制输出到stdout
使用分号可以抑制返回对象的显示,例如:
>>> 1+1
2

>>> 1+1;   # No output!

然而,一个将输出打印到标准输出的函数不受分号影响。

>>> print('Hello!')
Hello!

>>> MyFunction()
Calculating values...

如何抑制print / MyFunction 的输出?


对于 iruby 内核,只需在最后一行添加 nil 即可。 - frenesim
5个回答

297

在单元格的第一行添加%%capture,例如:

%%capture
print('Hello')
MyFunction()

这仅仅是丢弃输出,但是%%capture魔法命令可用于将输出保存到变量中 - 请参考文档


5
有人知道%%capture的反义词是什么吗?也就是说,如何停止单元格内的%%capture,还是在单元格结束之前一直启用? - David Parks
8
需要知道的好事是 %%capture 只在单元格结束之前启用,并且必须出现在单元格中的任何代码之前。(因此似乎没有办法在单元格内取消捕获。) - Arel
3
它不会丢弃警告,在我的情况下,我使用tensorflow.keras并获得他们的警告。 - till Kadabra
1
提供信息,%%capture capcap.show() 显示标准输出的内容。 - dixhom
1
嗯,可能发生了变化:UsageError:未找到行魔法函数%%capture - sh37211
显示剩余2条评论

142

抑制输出

在行末加上;以抑制输出内容[参考链接]。

一个好的实践是始终从函数中返回值而不是在函数内打印值。在这种情况下,您可以控制输出;如果您想打印返回值,则可以添加代码;否则,在函数调用后添加分号即可抑制输出。


9
这不适用于for循环内的代码。有什么想法吗?我只想禁止输出单元格中特定行的代码,而不是所有行。谢谢。 - Confounded
3
这种方法在Jupyter Notebook上对print()函数不起作用。然而,像1+1;这样的代码可以正常运行。 - song.xiao
3
对于某些第三方组件也不起作用;它似乎只抑制了本地 Python 的标准输出。 - Kirk Broadhurst
4
你没有读清问题,他明确表示他想要其他的东西。 - Jules G.M.
1
实际上,除非这是单元格的最后一个语句,否则jupyter不会打印变量的值。如果它是最后一个语句,分号将抑制输出,就像你提到的那样。 - HAltos
显示剩余3条评论

52

非常感谢,这让我疯狂了——我有一个启动函数,每次打开笔记本时都会调用%autosave,并希望抑制其输出。认为这很简单——但奇怪的是,contextlib.redirect_stdoutsys.stdout = open(os.devnull,'w')都失败了(最终会打印出额外的空行)。这应该是被接受的答案。 - Luke Davis
4
这是我最喜欢的答案,因为可以在不抑制所有输出的情况下抑制单元格中的一些输出。 - Wolpertinger
正是我所寻找的。 - deltasata
谢谢你挽救了一条生命。 - Matt
这在尝试运行instabot时不起作用 :( 仍然会返回一堆垃圾,因为它太破了。 - Raksha
请注意,capture_output(stdout=True, stderr=True) 可让您选择是否使用适当的设置来捕获 stdoutstderr 或两者。 - András Aszódi

1

pip install ipython-extensions

%%capture

print("hello")
#This cell will not return any output

%%Capture是Jupyter Notebook中用于抑制单元格输出的魔术命令。但是要运行它,您首先需要安装ipython-extensions。

现代的Jupyter已经包含了这个功能,所以不需要安装任何东西。即使这是真的,你也可以简单地在这里已经有最多赞的答案下面留个评论,因为你的回答并没有提供任何新的信息。 - undefined

-6

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

  1. 前往单元格
  2. 前往全部输出

然后选择您喜欢的选项。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接