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

news2024/11/17 21:27:08

问题描述

最近在复现一个开源项目时,发现执行过该项目中的代码单元格后,其余单元格的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.coloradmin.cn/o/1359266.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度解析 Compose 的 Modifier 原理 -- Modifier.composed()、ComposedModifier

众所周知&#xff1a;原理性分析的文章&#xff0c;真的很难讲的通俗易懂&#xff0c;讲的简单了就没必要写了&#xff0c;讲的繁琐难懂往往大家也不乐意看&#xff0c;所以只能尽量找个好的角度&#xff08;比如从 Demo 代码示例出发&#xff09;慢慢带着大家去钻源码&#xf…

书生·浦语大模型全链路开源开放体系

书生浦语大模型全链路开源体系_哔哩哔哩_bilibili 大模型全链路开源开放体系等你来探索~ https://github.com/internLM/tutorial 书生浦语全链条开源开放体系 1&#xff09;数据: 书生万卷 2TB数据&#xff0c;并行训练&#xff0c;极致优化涵盖多种模态与任务 预训练: I…

聚道云软件连接器助力某动漫行业公司实现财务自动化

客户介绍 某动漫行业公司是一家专注于文化创意领域&#xff0c;致力于为人们提供独特、有趣的文化产品。公司拥有一支充满活力和创造力的团队&#xff0c;他们以卓越的创意和精湛的技术&#xff0c;创造出了一系列令人惊叹的作品。未来&#xff0c;该公司将继续秉承这一理念&a…

低代码开发平台支持复杂的业务逻辑和API对接吗

当今数字化时代&#xff0c;企业和组织面临着日益复杂的业务需求。为了应对这些挑战&#xff0c;低代码开发平台应运而生。白码低代码开发平台是一种高效、灵活且可扩展的开发工具&#xff0c;能够支持复杂的业务逻辑和第三方API对接&#xff0c;为企业带来更快速、更灵活的解决…

Rust 字符串 初步了解

rust 的字符串 。字符串不是复合类型&#xff0c; String 和 &str &#xff1a; String 具有所有权&#xff0c;是存储在堆上的。&str 没有所有权&#xff0c;是对 String 的引用。字符串字面量也是 &str 类型&#xff0c;存储在栈上。 切片&#xff08;slice&a…

线性代数 --- 为什么LU分解中L矩阵的行列式一定等于(+-)1?

以下是关于下三角矩阵L的行列式一定等于-1的一些说明 证明&#xff1a;在LU分解中&#xff0c;下三角矩阵L的行列式一定是. 在证明之前&#xff0c;我这里先补充几条关于行列式的性质&#xff1a; 性质1&#xff1a;对于三角矩阵而言&#xff0c;不论是上三角矩阵还是下三角矩…

Qt6学习笔记:对象树

使用QObject及其子类创建的对象是以对象树的形式来组织的。创建一个QObject对象时若设置一个父对象&#xff0c;它就会被添加到父对象的子对象列表里&#xff0c;一个父对象被删除时&#xff0c;其全部的子对象都会自动删除。QObject类的构造函数里有一个参数用于设置对象的父对…

PyTorch基础操作

一、Tensor 在 PyTorch 中&#xff0c;张量&#xff08;Tensor&#xff09;是一个核心概念&#xff0c;它是一个用于存储和操作数据的多维数组&#xff0c;类似于 NumPy 的 ndarray&#xff0c;但与此同时&#xff0c;它也支持 GPU 加速&#xff0c;这使得在大规模数据上进行科…

数据结构和算法-希尔排序(增量序列 算法实现 性能分析 稳定性)

文章目录 希尔排序过程小结增量序列不是固定的 算法实现算法性能分析稳定性小结 希尔排序 基本有序&#xff0c;就是存在有序的子序列 通过增量4得到各个子表 对各个子表分别进行插入排序 缩小增量&#xff0c;再除2&#xff0c;此时的子表 对各个子表插入排序 缩小增量&…

数据库设计——DQL

D Q L \huge{DQL} DQL ⭐⭐⭐⭐⭐ DQL&#xff1a;数据库查询语言&#xff0c;用来查询数据库中的记录&#xff0c;非常的重要&#xff0c;对于数据库的操作修改相对来讲还是较少部分&#xff0c;绝大多数操作都是数据查询。 整体的语法结构&#xff1a; 基本查询 示例&#…

2024最新Java基础面试题大全(一)

1、String可以被继承&#xff1f; 不能被继承&#xff0c;因为String类有final修饰符&#xff0c;而final修饰的类是不能被继承的。 public final class String implements java.io.Serializable, Comparable<String>, CharSequence {// 省略...  }2、常见集合类 Java…

C语言编译器(C语言编程软件)完全攻略(第十七部分:Dev C++使用教程(使用Dev C++编写C语言程序))

介绍常用C语言编译器的安装、配置和使用。 十七、Dev C使用教程&#xff08;使用Dev C编写C语言程序&#xff09; 前面我们给出了一段完整的C语言代码&#xff0c;就是在显示器上输出“C语言中文网”&#xff0c;如下所示&#xff1a; #include <stdio.h> int main() {…

Java 新手如何使用Spring MVC RestAPI的加密

目录 前言 为什么需要加密RestAPI&#xff1f; 使用Spring Boot创建RestAPI 使用HTTPS加密RestAPI 使用Spring Security增加安全性 使用JWT实现令牌身份验证 使用Postman测试加密的RestAPI 总结 前言 作者简介&#xff1a; 懒大王敲代码&#xff0c;计算机专业…

HarmonyOS应用开发之DevEco Studio安装与初次使用

1、DevEco Studio介绍 DevEco Studio是基于IntelliJ IDEA Community开源版本打造&#xff0c;面向华为终端全场景多设备的一站式集成开发环境&#xff08;IDE&#xff09;&#xff0c;为开发者提供工程模板创建、开发、编译、调试、发布等E2E的HarmonyOS应用/服务的开发工具。…

【谷歌云】注册谷歌云 创建Compute Engine

文章目录 一、Google Cloud注册1.1 账号信息1.2 付款信息验证1.3 验证成功 二、Compute Engine创建2.1 启动Compute Engine API2.2 创建实例2.3 新建虚拟机实例2.4 等待实例创建完成2.5 查看虚拟机配置信息2.6 创建防火墙规则2.7 SSH远程连接虚拟机 三、参考链接 一、Google Cl…

坐标经纬度的基本运算(2个坐标经纬度的距离、中心点坐标经纬度范围内的坐标计算)

现在的应用大都居于LBS服务&#xff0c;用户地理位置的获取&#xff08;经纬度坐标、所属行政区域&#xff09;&#xff0c;提供服务场所的地理位置也有行政区域信息和坐标信息。 用户与服务场所的联系&#xff0c;就近服务原则的设计&#xff0c;服务场所相对于用户的排序。 …

Java JDBC整合(概述,搭建,PreparedStatement和Statement,结果集处理)

一、JDBC的概述&#xff1a; JDBC&#xff1a;是一种执行sql语句的Java APL&#xff0c;可以为多种关系类型数据库提供统一访问&#xff0c;它由一组用Java语言编写的类和接口组成。有了JDBC&#xff0c;Java人员只需要编写一次程序就可以访问不同的数据库。 JDBC APL&#xf…

代码随想录算法训练营第17天 |110.平衡二叉树 257. 二叉树的所有路径 404.左叶子之和

目录 110.平衡二叉树 &#x1f4a1;解题思路 递归 &#x1f4bb;实现代码 257. 二叉树的所有路径 &#x1f4a1;解题思路 递归 &#x1f4bb;实现代码 404.左叶子之和 &#x1f4a1;解题思路 # 递归法 &#x1f4bb;实现代码 110.平衡二叉树 题目链接&#xff1a;…

Spring整合MyBatis项目代码示例

文章目录 Spring整合MyBatis项目代码示例1、创建如下结构的项目Spring_MyBatis2、在pom.xml文件中添加以下依赖并刷新maven3、在resources文件夹下添加spring等配置文件&#xff08;applicationContext.xml&#xff0c;db.properties&#xff0c;log4j.properties&#xff09;4…

基于多反应堆的高并发服务器【C/C++/Reactor】(中)主线程反应堆模型的事件添加和处理详解

>>服务器和客户端建立连接和通信流程&#xff1a; 基于多反应堆模型的服务器结构图&#xff0c;这主要是一个TcpServer&#xff0c;关于HttpServer,主要是用了Http协议&#xff0c;核心模块是TcpServer。这里边有两种线程&#xff1a;主线程和子线程。子线程是在线程池里…