IPython会话运行时终端随机出现异常换行符是何原因?
问题描述
当IPython会话持续运行超过数分钟后,我的终端窗口中会随机出现换行符。
截图/示意图

环境信息
操作系统:
Edition Windows 11 Enterprise Version 21H2 Installed on 3/7/2022 OS build 22000.708 Experience Windows Feature Experience Pack 1000.22000.708.0
此前使用Windows 10系统时也出现过同样的问题。
终端信息:
Windows Terminal Preview Version: 1.14.1452.0 Profile: PowerShell Core, version: 7.2.4
我在其他版本的Windows Terminal以及其他版本的PowerShell环境下也遇到过该问题。
Python相关信息:
Python 3.8.10 (default, May 19 2021, 13:12:57) [MSC v.1916 64 bit (AMD64)]matplotlib 3.4.3
其他补充说明:
该问题似乎仅在使用matplotlib后触发,准确来说是实例化绘图对象之后出现,我当前使用的是Qt5Agg后端。
如果需要更多信息请随时告知,提前感谢!
解决方案
这是Qt5Agg后端的事件循环钩子和Windows终端输入处理逻辑冲突导致的:Qt后台驻留的事件循环会定期向终端标准输出写入不可见控制字符,触发终端自动换行。按优先级试以下几个方案即可解决:
- 切换matplotlib后端
如果不需要Qt绘图窗口的交互能力,直接换非Qt后端即可。IPython中执行魔法命令:
如果需要本地GUI交互窗口,换成TkAgg后端:%matplotlib inline
要永久生效就修改matplotlib配置文件%matplotlib tkmatplotlibrc中的backend参数,不用每次启动手动设置。 - 禁用Qt的终端输入钩子
如果必须用Qt5Agg后端,启动IPython时加参数禁用默认的Qt输入钩子:
也可以直接写进IPython配置文件永久生效:ipython --TerminalIPythonApp.gui=qt5 --no-qt-hookc.TerminalIPythonApp.gui = 'qt5' c.IPythonQtApp.qt_hook = False - 升级依赖版本
这个冲突在matplotlib 3.5.0+、PyQt5 5.15.7+版本已经做了针对性修复,直接升级相关包即可:pip install --upgrade matplotlib pyqt5
临时排查可以在实例化绘图对象后执行
plt.close('all')关闭所有绘图窗口,后台Qt事件循环会随之退出,随机换行的现象会立刻消失,可以用来确认是不是这个原因导致的。
内容的提问来源于stack exchange,提问作者Robbie Capps
相关产品推荐
相关产品推荐

