Setupterm не может найти терминал, в программе Python с использованием curses - PullRequest
23 голосов
/ 28 февраля 2012

Я пытаюсь заставить простой скрипт curses работать с использованием Python (с PyCharm 2.0).

Это мой сценарий:

import curses
stdscr = curses.initscr()
curses.noecho()
curses.cbreak()
stdscr.keypad(1)
while 1:
    c = stdscr.getch()
    if c == ord('p'): print("I pressed p")
    elif c == ord('q'): break

curses.nocbreak(); stdscr.keypad(0); curses.echo()
curses.endwin()

Когда я запускаю его из своей IDE (PyCharm 2) Я получаю следующую ошибку:


_curses.error: setupterm: could not find terminal
Process finished with exit code 1

Если я запускаю скрипт из bash, он просто застревает в цикле while, не реагируя ни на нажатие p, ни на q.

Anyбыла бы признательна за помощь.

Ответы [ 4 ]

24 голосов
/ 05 февраля 2014

Вы должны установить переменные окружения TERM и TERMINFO, например:

export TERM=linux
export TERMINFO=/etc/terminfo

И, если на вашем устройстве нет этого каталога (/etc/terminfo), создайте его и скопируйте базу данных terminfo.

Для терминалов "linux" и "pcansi" вы можете скачать базу данных:

12 голосов
/ 26 января 2018

Перейти к запуску / отладке конфигурации (рядом с кнопкой запуска Pycharm). Прилипание к терминалу эмуляции в выходной консоли. После этого вы сможете запустить вашу программу с помощью кнопки запуска.

1 голос
/ 14 января 2017

У меня была такая же проблема. См. Программирование Curses с использованием Python - Запуск и завершение приложения Curses .

Существует функция curses.wrapper(), которая упрощает процесс запуска / завершения приложения curses.

Вот пример из документа Python:

from curses import wrapper

def main(stdscr):
    # Clear screen
    stdscr.clear()

    # This raises ZeroDivisionError when i == 10.
    for i in range(0, 11):
        v = i-10
        stdscr.addstr(i, 0, '10 divided by {} is {}'.format(v, 10/v))

    stdscr.refresh()
    stdscr.getkey()

wrapper(main)
1 голос
/ 14 августа 2013

Я нашел этот вопрос при поиске примеров, потому что я также учусь использовать проклятия, поэтому я не знаю много об этом.Я знаю, что это работает, хотя:

import curses
try:
    stdscr = curses.initscr()
    curses.noecho()
    curses.cbreak()
    stdscr.keypad(1)
    while 1:
        c = stdscr.getch()
        if c == ord('p'):
            stdscr.addstr("I pressed p")
        elif c == ord('q'): break
finally:
    curses.nocbreak(); stdscr.keypad(0); curses.echo()
    curses.endwin()

Я также добавил попытку: finally: чтобы убедиться, что терминал получает его первоначальный вид, даже если внутри цикла что-то не так.

Вы должны использовать addstr, чтобы убедиться, что текст будет отображаться внутри окна.

...