如何在 Python 退出前清除用户输入

问题描述 投票:0回答:1

如果一个程序在其所有输入都被消耗之前退出,那么剩余的输入将被发送到 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,但不幸的是它导致程序挂起,直到用户输入一个空行。我想在不暂停程序的情况下清除剩余的输入。

python shell input command-line-interface
1个回答
2
投票

在 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 执行。

© www.soinside.com 2019 - 2024. All rights reserved.