在Python中输出到stdout时捕获stdin上的单字符输入

在Python中输出到stdout时捕获stdin上的单字符输入,python,Python,我正在用Python编写一个简单的双定时器。(我正在运行Linux,这应该只需要在我的系统上运行。)这个想法是脚本有两个独立的计时器,其中一个在任何时候都在运行。用户应能够按下按钮切换正在运行的计时器,或暂停两者。当前,测试脚本如下所示: now = datetime.datetime.now() until = now + datetime.timedelta(minutes=2) print now, while now < until: print "\r", now

我正在用Python编写一个简单的双定时器。(我正在运行Linux,这应该只需要在我的系统上运行。)这个想法是脚本有两个独立的计时器,其中一个在任何时候都在运行。用户应能够按下按钮切换正在运行的计时器,或暂停两者。当前,测试脚本如下所示:

now = datetime.datetime.now()
until = now + datetime.timedelta(minutes=2)
print now,
while now < until:
    print "\r",
    now = datetime.datetime.now()
    print now,
    sys.stdout.flush()
    # check stdin here
    time.sleep(0.1)
…除了需要用户按enter键才能识别命令外,该操作正常。是否有无需按enter键即可执行此操作的方法?

请参见此和

这两个都描述了特定于平台的选项或使用类似pygame的东西


但是,如果您需要一个不需要任何外部依赖关系的跨平台解决方案(例如pygame),我认为您也应该能够通过标准库中的线程模块来实现。(给我一点时间,我将尝试使用线程模块来拼凑一些东西…

本文中描述的“Linux上的Python非阻塞控制台输入”解决方案非常适合我的需要,谢谢!我不需要任何跨平台的兼容性。还有人建议使用curses,这也很有效,因为curses默认设置的模式与使用termios方法设置的模式相同。termios方法不会更改任何其他设置,但是,诅咒会更改,因此它更整洁。很高兴它有帮助!忽略我关于线程模块的部分。我当时离基地很远。
if select.select([sys.stdin],[],[],0.1)[0]:
    print sys.stdin.readline().strip()