如果一个程序在它的所有输入都被使用完之前退出,那么剩下的输入将被发送到shell。
下面是一个例子:
import sys
for line in sys.stdin:
sys.exit()
尝试运行该示例并复制粘贴此多行输入:
foo
bar
baz
结果将如下所示:
❯ python example.py
foo
bar
baz%
❯ bar
zsh: command not found: bar
❯ baz
在本例中,程序在消耗foo
后退出,因此bar
被自动发送到shell。如何在Python退出前清除剩余的输入?
示例中的for
循环表示复杂的逻辑,因此我正在寻找一种不修改for
循环的解决方案。
我尝试注册一个atexit
处理程序来清除输入:
import sys, atexit
def clear_stdin():
sys.stdin.read()
atexit.register(clear_stdin)
for line in sys.stdin:
sys.exit()
这个解决方案确实会清除输入并阻止它被发送到shell,但不幸的是,它会导致程序挂起,直到用户输入一个空行。我想在不暂停程序的情况下清除剩余的输入。
1条答案
按热度按时间chhqkbe11#
在Unix系统上,可以在阅读输入之前使用os.set_blocking。
如果用户粘贴了大量的文本,那么终端可能会保留尚未发送到stdin的额外输入。我不知道程序是否可能看到这一点,所以下面的例子包含了一个
sleep
,以允许终端提供更多的输入。这个例子还包含了几个保护措施来防止错误:这将防止剩余的输入被发送到shell,同时仍然允许程序立即退出:
如果最后一行没有以换行符结束,那么它不会被使用,但它也不会被shell执行。