Python诅咒unsets' onlcr'打破我的终端;如何正确重置*

时间:2018-01-30 16:21:19

标签: python terminal curses stty

我在Python3中有以下基本的curses实现。

#!/usr/bin/env python3

import curses
import time
from curses import wrapper

stdscr = curses.initscr() # required

curses.noecho() # don't show keyboard input
curses.cbreak() # don't require enter to send input

stdscr.keypad(True)

def main(stdscr):
   # curses.newwin(5, 10, 7, 20)
   stdscr.addstr("SUMMON SHOGGOTHS")
   stdscr.addstr(20, 30, "Razzmatazz")
   stdscr.refresh()
   time.sleep(3)



wrapper(main)

# Unwind
curses.nocbreak()
stdscr.keypad(False)
curses.echo()
curses.endwin()

几乎所有事情都发生了我所期待的:Shoggoths被召唤并且Razzes被篡改,然而当我输入git status我的断线被打破时。

stty -a之前和之后进行差异显示:

5c5
< iflags: -istrip icrnl -inlcr -igncr ixon -ixoff ixany imaxbel -iutf8
---
> iflags: -istrip -icrnl -inlcr -igncr ixon -ixoff ixany imaxbel -iutf8
7c7
< oflags: opost onlcr -oxtabs -onocr -onlret
---
> oflags: opost -onlcr -oxtabs -onocr -onlret

在调查这些选项后,我发现发布stty onlcr修复了终端。然而,我感到很惊讶,因为我认为curses.endwin()会重置我:

  

取消初始化库,并将终端返回正常状态。

我认为它可能是iTerm2中的一个问题,所以我尝试使用Terminal.app。这产生了同样的行为。

我难道还有其他一些重置技巧吗?我在基于C的实现中看到,stty数据通常被保存到一个结构中进行恢复......这可能是一种追求的途径。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

可能存在的问题(见source code):

  • curses wrapper方法执行initscrendwin
  • 当您的脚本退出 wrapper 时,curses库将返回 shell模式
  • 更改 curses.nocbreak() 是多余的,可能导致curses库的当前终端模式从程序模式更新
  • 致电 endwin 更新错误设置。

我只是删除标有“#Unwind”的块。