脚本中调用plt.show()导致Jupyter Console冻结的问题求助
解决Jupyter Console执行带plt.show()的脚本时冻结的问题
问题总结
使用run -i ./myscript.py执行包含plt.show()的脚本时,Jupyter Console冻结;移除该行后手动调用plt.show()正常,但操作繁琐。强制停止内核后会触发use_kernel_is_complete警告。
解决方案
方法1:指定非阻塞的matplotlib后端
在脚本开头添加后端配置代码,避免阻塞内核事件循环:
import matplotlib matplotlib.use('TkAgg') # 可选后端还有Qt5Agg、Qt6Agg等,根据系统支持选择 import numpy as np import matplotlib.pyplot as plt tf = 20 f0 = 1 fs = 4*np.pi*f0 t = np.arange(0, tf, 1/fs) fig, ax = plt.subplots() ax.plot(t, np.sin(2*np.pi*f0*t)) plt.show()
或者在Jupyter Console中先执行魔法命令配置后端,再运行脚本:
%matplotlib tk run -i ./myscript.py
方法2:让plt.show()非阻塞执行
修改脚本中的plt.show()为非阻塞模式,窗口弹出后不会占用内核:
plt.show(block=False)
原因说明
Jupyter Console的交互环境中,plt.show()默认启用阻塞模式,会抢占内核的事件循环,导致控制台无法响应输入。而手动调用时,内核已处于交互状态,事件循环能正常处理绘图和控制台输入的并发操作。
问题追踪(若确认为bug)
如果上述方法无法解决,可确认是否为matplotlib或Jupyter Console的兼容性问题:
- 提交到matplotlib官方问题追踪系统
- 提交到Jupyter Console的官方代码仓库
关于后续警告的说明
按<c-c>强制停止内核后,内核处于异常状态,无法响应is_complete_request检查,因此触发警告。解决冻结问题后,正常执行脚本不会出现该情况。
内容的提问来源于stack exchange,提问作者Barzi2001
相关产品推荐
相关产品推荐

