VSCode Jupyter print 函数输出在错误的单元格(cell)

问题描述

最近在复现一个开源项目时,发现执行过该项目中的代码单元格后,其余单元格的print函数输出也会续在该单元格后。而正常情况下print函数输出应该位于其所属的单元格。下图中,我将出现问题的单元格执行后清空了输出,但是在其他单元格执行 print 函数后,输出还是会打印到该单元格后。而在执行该单元格前 print 功能表现正常。重启电脑无效。

原因

一开始是以为是bug,但是重启电脑都没有看到问题解决,推测多半是正常的原因。而出现问题的单元格是引用开源代码,内部执行逻辑较为复杂,从函数内部找原因耗时较久。

于是突然想到是不是 print 的输出流定位错误了,于是搜了一下print的默认输出流。

In Python, the default output stream for the print() function is sys.stdout.

于是就打印一下 stdout。

import sys
print(sys.stdout)

输出结果如下:

`<_io.TextIOWrapper name='<stdout>' mode='w' encoding='utf-8'> `

看上去好像没啥问题?同样的代码新建了一个文件测试,得到的输出如下:

`<ipykernel.iostream.OutStream object at 0x7fd1ed6f5720>`

果然是有问题的。

我尝试了直接获取原来的默认的 ipykernel 的 OutStream,翻了官方的源码[1],没有找到直接获取 OutStream 的方法。花了一小段时间折腾出了下面的代码,自己新建一个 stream 。能用但是用warning,不知道有没有隐藏风险,再次记录一下:

import sys
from IPython.core.getipython import get_ipython
from ipykernel.iostream import OutStream
kernel = get_ipython().kernel
default_out = OutStream(kernel.session, kernel.iopub_socket, name='stdout')
sys.stdout = default_out

会提示 warning:

/tmp/ipykernel_3746745/352382136.py:2: DeprecationWarning: Since IPykernel 4.3, OutStream should be created with IOPubThread, not <ipykernel.iostream.BackgroundSocket object at 0x7fd1ed6f4790> default_out = OutStream(kernel.session, kernel.iopub_socket, name='stdout')

测试了一下不太行。所以就只有朴素的两种解决方案列在下面了。

解决方案

1. 避免 sys.stdout 的操作

检查出现问题的单元格所调用的代码,你应该最终能找到对 sys.stdout 做操作的代码。以我的情况为例,问题的原因是下面的代码。

大概是因为代码的原作者中间调用了一部分输出很多的代码,懒得处理就直接把stdout指向虚空,跑完了再改回来,但是 sys.__stdout__ 并不是 Jupyter 默认的 out stream,所以就回不来了。

第一种思路就是把这里做一些处理(注释或删除),取消掉对 sys.stdout 的操作。

2. 处理 sys.stdout 前备份,操作后还原

另一种思路则是备份默认的 Jupyter OutStream,在执行代码块前将 sys.stdout 保存到一个临时变量中,然后执行结束后再将临时变量的值赋回给 stdout。

original_stdout = sys.stdout
# 原有的造成问题的代码
# xxx
sys.stdout = original_stdout

备注

这个问题非常少见,谷歌也没有找到类似的情况,遇到这种情况也是非常难了。但是解决方案其实很简单,做个备份事后回复就好。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/324755.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是软件安全性测试?如何进行安全测试?

一、什么是软件安全性测试&#xff1f; 软件安全性测试是指对软件系统中的安全漏洞进行检测和评估的过程。其目的是为了确保软件系统在面对各种安全威胁时能够保持其功能的完整性、可用性和机密性。 二、软件安全性测试可以通过以下几个步骤来进行&#xff1a; 1. 需求分析&a…

Flink电商实时数仓项目部署上线

Flink实时数仓部署 将common作为一个自定义的依赖部署到maven中使用maven将各个子模块打包可以使用FLink框架进行jar包的提交运行。 StreamPark 一个易于使用的流处理应用开发框架和一站式流处理操作平台和管理流应用。它提供了Flink和Spark编写流的脚手架。 Core:可以使用…

如何使用 Python、Node.js 和 Go 创建基于 YOLOv8 的对象检测 Web 服务

1. 介绍 这是有关 YOLOv8 系列文章的第二篇。在上一篇文章中我们介绍了YOLOv8以及如何使用它&#xff0c;然后展示了如何使用 Python 和基于 PyTorch 的官方 YOLOv8 库创建一个 Web 服务来检测图像上的对象。 在本文中&#xff0c;将展示如何在不需要PyTorch和官方API的情况下…

【AI视野·今日Robot 机器人论文速览 第六十六期】Tue, 31 Oct 2023

AI视野今日CS.Robotics 机器人学论文速览 Tue, 31 Oct 2023 Totally 39 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers DEFT: Dexterous Fine-Tuning for Real-World Hand Policies Authors Aditya Kannan, Kenneth Shaw, Shikhar Bahl, Pragna Ma…

STM32时钟树

一、四个时钟源 二、时钟树 各类时钟简括&#xff1a; 1.HSE时钟&#xff08;高速外部时钟&#xff09;&#xff1a;来源为外部无源晶振&#xff0c;通常速度8M。 2.HSI时钟&#xff08;高速内部时钟&#xff09;&#xff1a;来源为芯片内部&#xff0c;大小为8M&#xff0c;当…

数据库设计——DML

D M L \huge{DML} DML DML&#xff1a;数据库操作语言&#xff0c;用来对数据库中的数据进行增删改查。 增&#xff08;INSERT&#xff09; 使用insert来向数据库中增加数据。 示例&#xff1a; -- DML : 数据操作语言 -- DML : 插入数据 - insert -- 1. 为 tb_emp 表的 us…

硬链接和软链接以及inode的简述【Linux】

硬链接和软链接 inode是什么&#xff1f;面试题 硬链接软链接 inode是什么&#xff1f; 认识inode之前&#xff0c;先来看一下一个文件在磁盘里面是怎么存储的。   首先一个物理的圆盘形状且多层的一个磁盘会被逻辑化成为一个数组&#xff0c;找到一个文件在这个数组里面叫做…

LeetCode 25. K 个一组翻转链表

K 个一组翻转链表 给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍&#xff0c;那么请将最后剩余的节点保持原有顺序。 你不能只是单纯的改…

安科瑞微机综合保护测控装置在某电厂10.5kV厂用电系统改造中的应用——安科瑞 顾烊宇

摘要&#xff1a;某电厂8号机10.5kV厂用电二次系统设备大多为常规电磁式继电器、电量变送器等。通过对厂用电二次系统从设备选型、设计、施工调试等方面进行的改造&#xff0c;尤其微机综合保护测控装置的应用&#xff0c;集控制、保护、测量、信号报警、开关量采集、通讯功能于…

【Java 进阶篇】Nginx 使用详解:搭建高性能的 Web 服务器

在互联网的世界里&#xff0c;Web 服务器是我们访问网站、获取信息的入口。Nginx&#xff08;发音"engine x"&#xff09;作为一款轻量级、高性能的 Web 服务器和反向代理服务器&#xff0c;因其出色的性能和可扩展性而备受推崇。本文将围绕 Nginx 的使用进行详解&am…

新手小白如何搭建自己的服务器

由于近期六年前的域名到期了&#xff0c;阿里云的客服电话&#xff0c;正好提醒了我需要管理下这方面的东西&#xff0c; 正好看到阿里云的服务器99/年&#xff0c;而且可以原价续费两年&#xff0c;截止日期为2026年3月&#xff0c;所以我还是剁手了。 借着这次机会写一部分建…

Linux系统安装MySQL

Linux系统安装MySQL 第一步&#xff1a;下载YUM wget http://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm第二步&#xff1a;安装MySQL的YUM 仓库 rpm -ivh mysql57-community-release-el7-11.noarch.rpm第三步&#xff1a;查看MySQL版本 yum repolist …