Использование подпроцесса в приложении curses - PullRequest
1 голос
/ 01 декабря 2011

Я создаю приложение, которое использует curses для создания простого пользовательского интерфейса. Он также использует модуль subprocess для запуска внешнего текстового редактора, чтобы пользователь мог набрать текст, затем закрыть редактор и вернуться к основной программе.

Проблема в том, что когда редактор работает на консоли, такой как Vim или Nano, curses не деинициализируется должным образом. Это означает, что если используется цветовой режим (curses.start_color()), терминал остается цветным после завершения программы.

Вот тестовый скрипт, который имеет эту проблему (по крайней мере для меня, я использую Ubuntu и gnome-терминал):

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 голосов
/ 01 декабря 2011

Достаточно ли для вас изменения кода:

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

?Или в вашем реальном сценарии есть какое-то дополнительное поведение, которого нет в коде, который вы вставили здесь, что делает этот обходной путь неподходящим для вашей цели?

...