从Jupyter笔记本电脑重定向到的stdout正在终点站着陆

2024-06-01 07:11:02 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我试图将Jupyter笔记本中某个单元格的stdout重定向到一个this文件,然后用this取消它。第一组单元格的输出按原意加载到文件中。在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

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

如何调整这段代码,以便在重置它之后,我得到b出现在通常输出的单元下面,而不是在终端中?


Tags: 文件命令终端stdoutsysjs笔记本jupyter
1条回答
网友
1楼 · 发布于 2024-06-01 07:11:02

我无法测试,但我看到的唯一解释是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

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

相关问题 更多 >