如何在Python中重新初始化readline模块?解决WINCH信号适配问题
解决Python捕获SIGWINCH信号后readline窗口尺寸异常问题
问题场景
我在Python程序中捕获WINCH信号的代码如下:
def WinResize(num, stack): # 自定义业务逻辑 signal.signal(signal.SIGWINCH, WinResize)
捕获信号后,readline无法感知终端窗口尺寸变化,内部存储的尺寸信息始终错误。尝试在WinResize函数末尾执行readline.set_completer(readline.get_completer()),仅能在输入换行时触发尺寸更新,换行前的输入行仍沿用旧尺寸显示。不捕获SIGWINCH信号时readline工作正常,需彻底解决该问题。
解决方案
要让readline在窗口尺寸变化时立即更新状态,需在信号处理函数中直接强制readline读取新的终端尺寸并刷新显示,而非依赖 completer 的间接刷新逻辑。具体实现如下:
修改后的信号处理函数
import signal import readline import os def WinResize(num, stack): # 保留你的自定义业务逻辑 # ... # 强制更新readline的窗口尺寸与显示 rows, cols = os.get_terminal_size() readline.set_screen_size(rows, cols) readline.redisplay() signal.signal(signal.SIGWINCH, WinResize)
关键逻辑说明
os.get_terminal_size():获取终端最新的行数和列数,确保拿到真实的窗口尺寸readline.set_screen_size(rows, cols):直接将新尺寸传递给readline,更新其内部存储的尺寸状态readline.redisplay():强制重新绘制当前输入行,让新尺寸立即生效,无需等待用户输入换行
备选方案(仅当上述方案失效时使用)
如果直接设置尺寸和刷新的方式无效,可以尝试通过模拟键盘输入触发readline的内部刷新逻辑(属于hack方式,优先用上面的方案):
def WinResize(num, stack): # 自定义逻辑... # 模拟输入空格再退格,触发readline刷新 import sys sys.stdout.write(' \b') sys.stdout.flush()
内容的提问来源于stack exchange,提问作者chrislamp
相关产品推荐
相关产品推荐

