如果一个程序在其所有输入都被消耗之前退出,那么剩余的输入将被发送到 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,但不幸的是它导致程序挂起,直到用户输入一个空行。我想在不暂停程序的情况下清除剩余的输入。
在 Unix 系统上,您可以在读取输入之前使用 os.set_blocking。以下示例具有防止错误的保护措施:
import sys, atexit, os
def clear_stdin():
if sys.__stdin__ and sys.__stdin__.isatty() and hasattr(os, 'set_blocking'):
try:
os.set_blocking(sys.__stdin__.fileno(), False)
except OSError:
return
sys.__stdin__.read()
atexit.register(clear_stdin)
for line in sys.stdin:
sys.exit()
这将阻止剩余的输入被发送到 shell,同时仍然允许程序立即退出:
❯ python example.py
foo
bar
baz%
❯ baz
如果最后一行不是以换行符结尾,那么它不会被消费,但也不会被 shell 执行。