在curses应用中使用子进程

1 投票
1 回答
1170 浏览
提问于 2025-04-17 07:25

我正在创建一个应用程序,使用 curses 来构建一个简单的用户界面。它还使用 subprocess 模块来运行外部文本编辑器,这样用户就可以输入一些文本,然后关闭编辑器,返回到主程序。

问题是,当编辑器是基于控制台的,比如 Vim 或 Nano 时,curses 没有正确地关闭。这意味着如果使用了颜色模式(curses.start_color()),程序结束后终端的颜色会保持不变。

这里有一个测试脚本,存在这个问题(至少对我来说,我使用的是 Ubuntu 和 gnome-terminal):

import curses
import subprocess

screen = curses.initscr()
curses.noecho()
curses.cbreak()
screen.keypad(1)
try:
    curses.curs_set(0)
except curses.error:
    pass
curses.start_color()

screen.addstr(0, 0, 'hello, world!')
screen.refresh()

while 1:
    c = screen.getch()
    if c == ord('q'):
        break
    if c == ord('r'):
        subprocess.call('vim', shell=False)
        screen.clear()
        screen.addstr(0, 0, 'hello, world!')
        screen.refresh()

curses.nocbreak()
screen.keypad(0)
curses.echo()
curses.curs_set(1)
curses.endwin()

(按 r 进入 Vim,然后按 q 退出。)

有没有办法解决这个问题?

1 个回答

0

你觉得把你的代码改成这样:

if c == ord('q'):
    subprocess.call('reset', shell=False)
    break

这样就够了吗?还是说在你实际的脚本中,还有一些其他的行为是你在这里贴的代码里没有的,这让这个解决办法不适合你的目标呢?

撰写回答