来自Jupyter笔记本的stdout重定向已登陆终端

car*_*mom 4 python jupyter-notebook python-3.6

因此,我尝试将stdoutJupyter Notebook中的某些单元格重定向到与此相关的文件,然后针对其余单元格使用文件将其取消。第一组单元格的输出按原样放置在文件中。在cancel命令之后的第二组单元格sys.stdout = sys.__stdout__没有给出任何输出,似乎什么也没做,但后来我意识到它降落在启动笔记本电脑的终端中。

它与完全相同的Python在Python解释器中完美工作:

(miniconda3-latest) cardamom@pegasus:~/Documents/project1 $ python
Python 3.6.0 |Continuum Analytics, Inc.| (default, Dec 23 2016, 12:22:00) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.stdout = open('stdout.txt', 'w')
>>> print("a")
>>> print("a")
>>> print("a")
>>> sys.stdout = sys.__stdout__
>>> print ("b")
b
>>> print ("b")
b
>>> print ("b")
b
>>> # lots of a's are in the file and no b's
Run Code Online (Sandbox Code Playgroud)

Jupyter笔记本中的类似方法是在终端中进行以下操作:

[W 22:05:34.192 NotebookApp] 404 GET /nbextensions/widgets/notebook/js/extension.js (127.0.0.1) 1.71ms referer=http://localhost:8889/notebooks/test_stdout.ipynb
b
b
b
Run Code Online (Sandbox Code Playgroud)

如何修改此代码,以便在重置之后,让b出现在通常输出的单元格下面而不是在终端下?

Jea*_*bre 5

我无法对此进行测试,但我看到的唯一解释是,sys.stdout不是 sys.__stdout__经过重新路由/修改的文件对象,以便能够将数据放入单元格中(您的注释表明它是一个ipykernel.iostream.OutStream实例)。

因此sys.__stdout__,您应该存储以下内容的引用,而不是重置为sys.stdout

import sys
old_stdout = sys.stdout
sys.stdout = open('stdout.txt', 'w')
...
sys.stdout = old_stdout
Run Code Online (Sandbox Code Playgroud)

请注意,此方法也适用于标准终端。

  • 当您的程序中止时,问题就来了。Jupyter 会记住 stdout 的状态,如果不重启内核就无法恢复。这很不方便。是否有其他方法可以重置标准输出以重定向到 Jupyter 笔记本? (3认同)