Mik*_*iLL 2 python stdin flush
作为一个非常新的os和命令行进程的php程序员,我很惊讶在python中,用户在与程序交互过程中输入的所有内容似乎都被缓冲,等待第一次使用时倒出的raw_input(例如).
找到一些代码来调用之前raw_input似乎"解决"osX上的问题,虽然据说它提供了对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)
Run Code Online (Sandbox Code Playgroud)
我是否正确理解stdin和stdout,stderr方法会因操作系统而异?
我想像Django这样的框架可能有内置的方法来简化交互性,但它基本上只需要几行代码来告诉python"在被邀请之前不接受任何输入?"
唉唉.如果我正确地理解这一点(并且我确信理解需要进行很多改进),答案是肯定的stdin, stdout, stderr,"标准"输入,输出和错误流及其处理可能因系统(操作)而异.它们是操作系统的产品,而不是任何特定的编程语言.
"告诉python在请求输入之前忽略stdin"的期望将自动源于对"终端"的思考,好像它是打字机一样.在打字机的目标是以人类可读格式记录信息串的情况下,终端的目标是传输最终将被转换为机器可读格式的信息,并返回人类可读的响应.
我们大多数人当前认为计算机作为"终端"实际上是一种虚拟的物理机器,它被称为终端,它曾经是数据输入和读取计算机处理器的方法,对吧?文本编辑器是一种应用程序,它可以从键盘创建虚拟类型编写器,监视和处理操作系统的功能以及包含的程序库.
像mac OS终端这样的应用程序甚至我们用来通过和ssh连接与另一个服务器进行交互的应用程序实际上创建了一个虚拟终端,通过它我们可以与处理器交互,但是向stdin发送信息并从stdout和strerr接收.当我们输入的字母出现在终端屏幕上时,这是因为它被"回显"回终端窗口.
因此,没有理由期望python或任何其他语言与终端之间的关系默认会阻止来自终端的输入流.
上面的代码使用pythons exception handling提供了两种替代方法,在代表程序进行某些活动之前刷新输入流.在OSX平台上的代码:
import sys, termios
termios.tcflush(sys.stdin, termios.TCIOFLUSH)
Run Code Online (Sandbox Code Playgroud)
导入系统,这样我们就可以访问stdin和termios,这是用于管理实际管理两个虚拟终端的POSIX(LINUX,UNIX)应用程序的python模块 - 一个介于自身和用户之间,另一个介于自身和操作系统之间.tcflush似乎是一个接受至少两个参数的函数 - 第一个是要刷新的WHICH流 - file descriptor(fd),第二个是要刷新的队列.在这种情况下,我不确定文件描述符和队列之间的区别是什么,除了可能fd包含尚未添加到队列的数据并且队列包含不再包含在fd中的数据.
msvcrt是用于与终端的任何Windows版本进行交互(管理)的python模块,我猜msvcrt.kbhit()并且msvcrt.getch()是用于刷新它的输入队列的函数.
该函数的UNIX和Windows调用可以交换,以便不是说,try:按照Windows的方式进行操作,如果ImportError在UNIX中引用它,我们try:首先是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()
Run Code Online (Sandbox Code Playgroud)
这是一个有助于澄清过程的termios介绍.
| 归档时间: |
|
| 查看次数: |
4738 次 |
| 最近记录: |