在Python中同时从stdin捕获单字符输入并输出到stdout

2 投票
1 回答
708 浏览
提问于 2025-04-15 22:56

我正在用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)

(这里我省略了代码中的导入部分。)

这个程序每0.1秒输出一次当前计时器的值,并且会覆盖之前的值。

不过,我在实现# check stdin here这一行时遇到了问题。理想情况下,用户只需按“p”键,计时器就会暂停。目前,我在time.sleep(0.1)的位置放了这个:

if select.select([sys.stdin],[],[],0.1)[0]:
    print sys.stdin.readline().strip()

...这个方法可以工作,但需要用户按下回车键才能识别命令。有没有办法做到这一点,而不需要按回车键呢?

1 个回答

2

可以看看这个SO问题这篇文章

这两者都提到了特定平台的选项或者使用像pygame这样的工具。

不过,如果你需要一个跨平台的解决方案,而且不想依赖任何外部库(比如pygame),我觉得你可以通过标准库里的线程模块来实现这个功能。(给我一点时间,我会尝试用线程模块拼凑出一些东西来...)

撰写回答