我正在使用 ipython
笔记本 (http://ipython.org/notebook.html) 进行演示,但似乎打印函数无法工作:
为了更清晰地表述,上图中的命令已在此处重新编写。
In [1]: 'hello world'
Out [1]: 'hello world'
In [2]: print 'hello world'
简而言之,[2]
没有输出任何打印内容。
请问是否有人知道这是一个已知的 bug?并且是否有人知道如何修复?
我正在使用 ipython
笔记本 (http://ipython.org/notebook.html) 进行演示,但似乎打印函数无法工作:
为了更清晰地表述,上图中的命令已在此处重新编写。
In [1]: 'hello world'
Out [1]: 'hello world'
In [2]: print 'hello world'
简而言之,[2]
没有输出任何打印内容。
请问是否有人知道这是一个已知的 bug?并且是否有人知道如何修复?
当我第一个代码单元格为以下内容时,我遇到了类似的打印问题:
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
那么我已经注释掉了第二和第三行,就像这样:
import sys
#reload(sys)
#sys.setdefaultencoding("utf-8")
重置内核并重新运行程序,现在我的打印语句可以正常工作。
后来我发现,在我最初遇到打印问题时,所有的打印输出实际上都被发送到ipython控制台终端(在我的Linux系统上),而不是嵌入笔记本中。
reload(sys)
的调用在另一个Python包(例如pykwalify==1.5.2
)中,则无法解决问题。本主题中的另一个修复方法可以解决此问题,因为它存储了输出流,然后重新加载sys(无论发生在哪里),最后将输出流重置为您存储的流。 - JoostJM我遇到了类似的问题(reload(sys)
在我导入的一个包里)。
我的解决方法是,在脚本顶部导入 sys
,并将 sys.stdout
存储在单独的变量中,例如 stdout
。
然后我导入所有其他的东西,包括调用 reload(sys)
的那个。
最后,在结尾处,我设置 sys.stdout = stdout
,将输出重定向回 IPython 笔记本。
根据 @JoostJM 所说的,以下是可行的代码示例:
import sys
stdout = sys.stdout
reload(sys)
sys.setdefaultencoding('utf-8')
sys.stdout = stdout
更改默认编码将输出重定向到控制台,这将将其设置回Jupyter笔记本。
这个问题的另一个来源可能是因为“不受信任”的笔记本电脑。在我的情况下,我从GitHub下载了源文件,当执行单元格时,没有输出显示。事实证明,笔记本没有得到信任。所以,我点击菜单文件
,然后信任笔记本
。Jupyter进行的这项安全检查旨在避免执行隐藏在单元格中的恶意代码块。
import sys
stdout = sys.stdout
# some functions that mess up sys.stdout
sys.stdout = stdout
sys.setdefaultencoding('utf-8')
(这导致我的打印问题),而是单独对变量进行编码:foo.encode('utf-8')
。同样,不确定你的问题是否和我的一样,但是这个方法解决了我的问题。 - tmthyjames