在IPython Notebook中没有输出结果显示

60

我正在使用 ipython 笔记本 (http://ipython.org/notebook.html) 进行演示,但似乎打印函数无法工作:

enter image description here

为了更清晰地表述,上图中的命令已在此处重新编写。

In [1]: 'hello world'
Out [1]: 'hello world'

In [2]: print 'hello world'

简而言之,[2] 没有输出任何打印内容。

请问是否有人知道这是一个已知的 bug?并且是否有人知道如何修复?


问题细胞的细胞类型是什么? - Alex Rothberg
1
我也遇到了同样的问题。为了“修复”它,我不得不重新启动内核。你有没有找到真正的解决方法? - tmthyjames
4
在顶部标签中点击Kernel > Restart. 我找到了解决我的问题的方法;不确定它是否适用于你的情况。我没有运行sys.setdefaultencoding('utf-8')(这导致我的打印问题),而是单独对变量进行编码:foo.encode('utf-8')。同样,不确定你的问题是否和我的一样,但是这个方法解决了我的问题。 - tmthyjames
当我使用sys.setdefaultencoding('utf-8')时,我遇到了同样的问题。 - patapouf_ai
默认情况下,IPython 无法在 Python 2.7 中显示 Unicode 变量(例如,拒绝打印带有任何非 ASCII 字符的 Pandas 数据框)。 - Frederic Bazin
显示剩余2条评论
5个回答

58

当我第一个代码单元格为以下内容时,我遇到了类似的打印问题:

import sys
reload(sys)
sys.setdefaultencoding("utf-8")

那么我已经注释掉了第二和第三行,就像这样:

import sys
#reload(sys)
#sys.setdefaultencoding("utf-8")

重置内核并重新运行程序,现在我的打印语句可以正常工作。

后来我发现,在我最初遇到打印问题时,所有的打印输出实际上都被发送到ipython控制台终端(在我的Linux系统上),而不是嵌入笔记本中。


1
对我来说也是一样。所有的打印输出都被发送到控制台。同时将默认编码设置为 utf8。 - patapouf_ai
这一切都很好,但如果对reload(sys)的调用在另一个Python包(例如pykwalify==1.5.2)中,则无法解决问题。本主题中的另一个修复方法可以解决此问题,因为它存储了输出流,然后重新加载sys(无论发生在哪里),最后将输出流重置为您存储的流。 - JoostJM
1
重新加载未定义。 - Pyd

31

我遇到了类似的问题(reload(sys) 在我导入的一个包里)。

我的解决方法是,在脚本顶部导入 sys,并将 sys.stdout 存储在单独的变量中,例如 stdout

然后我导入所有其他的东西,包括调用 reload(sys) 的那个。

最后,在结尾处,我设置 sys.stdout = stdout,将输出重定向回 IPython 笔记本。


2
这应该是正确的答案。如果您需要默认编码为utf8,则上面的答案无法解决问题。真正的问题在于,重新加载sys会将stdout重置为控制台,因此您需要像这里所示的那样将其重置回来。 - AsAP_Sherb

27

根据 @JoostJM 所说的,以下是可行的代码示例:

import sys
stdout = sys.stdout
reload(sys)
sys.setdefaultencoding('utf-8')
sys.stdout = stdout

更改默认编码将输出重定向到控制台,这将将其设置回Jupyter笔记本。


1
print("你好,世界") 如果使用 Python 3 - user2584621

2

这个问题的另一个来源可能是因为“不受信任”的笔记本电脑。在我的情况下,我从GitHub下载了源文件,当执行单元格时,没有输出显示。事实证明,笔记本没有得到信任。所以,我点击菜单文件,然后信任笔记本。Jupyter进行的这项安全检查旨在避免执行隐藏在单元格中的恶意代码块。


1
我正在使用Python 3,所以对我来说解决方案有些不同。
import sys
stdout = sys.stdout

# some functions that mess up sys.stdout

sys.stdout = stdout

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