在使用curses的Python程序中,Setupterm无法找到终端。

42

我正在尝试使用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: 找不到终端 进程以退出码1结束
如果我从bash中运行脚本,它将只是在while循环中被卡住,无法对按下p或q做出反应。
任何帮助将不胜感激。
6个回答

40

我在从cron运行脚本时遇到了这个问题,您需要在每一行上删除'export'才能设置环境变量而不让crontab抱怨。 - baku
1
很不确定 TERM=linux 是正确的,设置 TERMINFO 是多余或冲突的。TERM 的值取决于用于显示的终端(IDE 开发者显然忽视了正确处理此事)。 - Thomas Dickey

31

请前往运行/调试配置(位于Pycharm的运行按钮旁边)。在输出控制台中选择模拟终端。随后,您就可以使用运行按钮来运行程序了。


这就是我的全部了! - mcouthon

2
如果你正在使用Idle, 你会看到这个错误。这是因为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文档中的示例:

from curses import wrapper

def main(stdscr):
    # 清屏
    stdscr.clear()
# 当i == 10时,这会引发ZeroDivisionError。 for i in range(0, 11): v = i-10 stdscr.addstr(i, 0, '10除以{}等于{}'.format(v, 10/v))
stdscr.refresh() stdscr.getkey()
wrapper(main)

-2
如果您正在使用 macOS 并运行 PyCharm,则需要从IDE自身设置环境变量以进行执行范围。
编辑配置 -> 环境变量
然后添加以下名称-值对
TERM linux
TERMINFO / etc / zsh
以上相当于从控制台导出环境变量,方法如下:
$ export TERM=linux
$ export TERMINFO=/bin/zsh

TERM 的默认值是 xterm,其他值包括 [konsole, rxvt]。 例如,rxvt 经常构建支持 16 种颜色。您可以尝试将 TERM 设置为 rxvt-16color。

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

这就像告诉您的程序,您将要登录到类似于 /bin/zsh 所在的 Linux 终端(TERM)。对于使用 bash shell,它可能类似于 /bin/bash。


1
zsh和bash不是您的终端应用程序。它们是可以接受输入并向终端产生输出的shell,就像任何其他程序一样,例如grep、sed、VS Code或Google Chrome。终端应用程序的示例包括xterm、Konsole或GNOME终端。TERMINFO不应该是您的终端应用程序。它应该是包含终端数据库文件的目录。例如:/usr/share/terminfo/ - Larry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接