在使用curses的Python程序中,Setupterm找不到终端

问题描述 投票:0回答:6

我正在尝试使用Python(使用PyCharm 2.0)运行一个简单的curses脚本。

这是我的脚本:

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 做出反应。

如有任何帮助,我们将不胜感激。

python curses terminfo
6个回答
39
投票

您必须设置环境变量

TERM
TERMINFO
,如下所示:

export TERM=linux
export TERMINFO=/etc/terminfo

并且,如果您的设备没有此目录 (

/etc/terminfo
),请创建它并复制 terminfo 数据库。

对于“linux”和“pcansi”终端,您可以下载数据库:


30
投票

转到运行/调试配置(Pycharm 运行按钮旁边的那个)。坚持在输出控制台中模拟终端。然后您就可以使用运行按钮来运行您的程序。


2
投票

如果您使用“空闲”,您会看到此错误。这是因为 Idle 默认的输入/输出重定向。尝试从命令行运行您的程序。

python3 <filename>.py


1
投票

我在搜索示例时发现了这个问题,因为我也在学习使用curses,所以我对此不太了解。我知道这行得通:

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()

我还添加了 try:finally: 以确保即使循环内出现简单的问题,我也能将终端恢复到原来的外观。

您必须使用 addstr 来确保文本将显示在窗口内。


0
投票

我也遇到了同样的问题。请参阅使用 Python 进行 Curses 编程 - 启动和结束 Curses 应用程序

有一个

curses.wrapper()
功能可以简化启动/结束curses应用程序的过程。

这是 Python 文档中的示例:

来自curses导入包装

def main(stdscr):
    # 清屏
    stdscr.clear()

    # 当 i == 10 时,这会引发 ZeroDivisionError。
    对于范围 (0, 11) 内的 i:
        v = i-10
        stdscr.addstr(i, 0, '10 除以 {} 为 {}'.format(v, 10/v))

    stdscr.refresh()
    stdscr.getkey()

包装器(主要)

-1
投票

如果您使用 macOS 并运行 PyCharm,则必须从 IDE 本身设置环境变量以实现执行范围。

编辑配置 -> 环境变量

然后添加以下名称-值对

Linux 术语

TERMINFO /etc/zsh

上面相当于从控制台导出环境变量,这样做是这样的

$ export TERM=linux
$ export TERMINFO=/bin/zsh

TERM 默认为 xterm,其他值为 [konsole, rxvt] 例如,rxvt 通常支持 16 种颜色。你可以尝试将TERM设置为rxvt-16color。

/bin/zsh 是我在 mac 中使用的终端应用程序的路径。

这就像告诉你的程序你将登录到 linux(TERM) 之类的终端,可以在 /bin/zsh 找到。对于使用 bash shell,它可能类似于 /bin/bash 。

© www.soinside.com 2019 - 2024. All rights reserved.