Python 在 raw_input() 之前刷新输入

标签 python stdin flush

作为一名对操作系统和命令行进程非常陌生的 php 程序员(某种程度上),我很惊讶在 python 中,用户在与程序交互过程中输入的所有内容似乎都被缓冲,等待在第一次使用raw_input(例如)。

raw_input 之前找到了一些代码,这似乎“解决”了 osX 上的问题,尽管据说它提供了 access to windows能力:

class FlushInput(object):

    def flush_input(self):
        try:
            import msvcrt
            while msvcrt.kbhit():
                msvcrt.getch()
        except ImportError:
            import sys, termios
            termios.tcflush(sys.stdin, termios.TCIOFLUSH)

我是否正确理解 stdin 和 stdout、stderr 方法在操作系统之间会有所不同?

我想像Django这样的框架可能有内置的方法来简化交互性,但是它基本上需要几行代码来告诉python“在被邀请之前不要接受任何输入吗?”

最佳答案

啊啊。如果我正确理解这一点(并且我确信这种理解需要进一步完善),那么答案是肯定的,stdin、stdout、stderr、“标准”输入、输出和错误流及其处理可能因(操作系统)系统而异,因为它们是操作系统的产品,而不是任何特定的编程语言。

“告诉 python 在请求输入之前忽略 stdin”的期望将自动源于将“终端”视为打字机的想法。打字机的目标是以人类可读的格式记录信息字符串,而终端的目标是传输最终转换为机器可读格式的信息,并返回人类可读的响应。

我们大多数人目前所认为的“终端”实际上是对称为终端的物理机器的虚拟娱乐,它曾经是向计算机处理器输入和读取数据的方法, 正确的?文本编辑器是一种应用程序,它可以利用操作系统的键盘、监视器和处理功能以及包含的程序库创建虚拟打字机。

像 mac OS 终端甚至我们用来通过 ssh 连接与另一台服务器交互的 tty 这样的应用程序实际上是在创建一个虚拟终端,通过它我们可以与处理器交互,但是将信息发送到 stdin 并从 stdout 接收信息斯特雷尔。当我们输入的字母出现在终端屏幕上时,这是因为它被“回显”回终端窗口中。

因此,没有理由期望 Python 或任何其他语言与终端之间的关系默认会阻止来自终端的输入流。

上面的代码使用 python 异常处理来提供两种替代方法,在代表程序进行某些事件之前刷新输入流。在 OSX 平台上代码:

import sys, termios
termios.tcflush(sys.stdin, termios.TCIOFLUSH)

导入系统,这样我们就可以访问stdin和termios,这是python的模块,用于管理POSIX(LINUX,UNIX)应用程序,它实际上管理两个虚拟终端——一个在它自己和用户之间,另一个在它自己和用户之间操作系统。 tcflush 似乎是一个至少接受两个参数的函数 - 第一个是要刷新的流 - 文件描述符 (fd),第二个是要刷新的队列。我不确定在这种情况下文件描述符和队列之间有什么区别,除了 fd 可能包含尚未添加到队列中的数据而队列包含不再包含在 fd 中的数据之外.

msvcrt 是用于与任何 Windows 版本的终端进行交互(管理)的 python 模块,我猜 msvcrt.kbhit()msvcrt。 getch() 是用于刷新输入队列的函数。

该函数的 UNIX 和 Windows 调用可以交换,这样就不用说,try: 按照 Windows 方式执行,如果出现 ImportError , UNIX 是,我们尝试:首先采用 UNIX 方式:

class FlushInput(object):

    def flush_input(self):
        try:
            import sys, termios
            termios.tcflush(sys.stdin, termios.TCIOFLUSH)
        except ImportError:
            import msvcrt
            while msvcrt.kbhit():
                msvcrt.getch()

这是a termios introduction这有助于澄清流程。

关于Python 在 raw_input() 之前刷新输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24582233/

相关文章:

Python - 程序崩溃后继续程序

java - 在 Java 中重定向标准输入和标准输出

c++ - C++ cout和cin缓冲区,以及一般的缓冲区

python - Django 和 Angular 2 templateUrl

python - "wxPython in Action"图书程序可以直接运行,但不能从 Notepad++ 运行

python - nltk.metrics.distance中Jaccard距离度量的实现与数学定义不一致?

powershell - 如何评估来自标准输入的 PowerShell 脚本输入

c++ - 有限制的 cin.ignore 是否继续丢弃新输入?

c - 如何检查stdin在C中是否为空

caching - clflush 指令是否仅从 1 级缓存刷新 block ?