如何确定在Python中是否有从Windows上的stdin读取的数据?

awa*_*tts 6 python

这段代码

select.select([sys.stdin], [], [], 1.0)
Run Code Online (Sandbox Code Playgroud)

在Linux上完全符合我的要求,但在Windows中却没有.

我已经使用kbhit()msvcrt之前看数据是否可用标准输入读取,但在这种情况下,它总是返回0.另外msvcrt.getch()返回'\xff'sys.stdin.read(1)返回'\x01'.似乎msvcrt函数表现不正常.

不幸的是我不能使用TCP套接字,因为我无法控制应用程序说我的Python程序.

S.L*_*ott 2

在某些罕见的情况下,您可能会关心 stdin 连接到什么。大多数情况下,您并不关心——您只需读取标准输入。

在 中someprocess | python myprogram.py,stdin 连接到管道;在本例中,是前一个进程的标准输出。您只需sys.stdin从其他进程中读取数据即可。[但请注意,在 Windows 中,仍然(可能)有一个带有键盘的“CON”设备。只是不会sys.stdin。]

在 中python myprogram.py <someFile,stdin 连接到文件。您只需读取sys.stdin文件即可。

在 中python myprogram.py,stdin 保持连接到控制台(/dev/ttyxx在 *nix 中)。您可以简单地sys.stdin从键盘上读取内容。

请注意上述三种情况的共同主题。您只需阅读sys.stdin,程序的环境就会为您定义一切。您不会检查“以查看标准输入上是否有数据可供读取”。它已经可用了。

有时,您想要键盘中断(或其他恶作剧)。顺便说一句,Python 将键盘中断作为 I/O 元素的首要功能。Control-C 在 I/O 期间引发中断(它不会进入紧密循环,但会向程序发出定期打印的信号。)

有时您需要找出stdin连接到什么类型的文件。

类似于os.isatty( sys.stdin.fileno() ) “如果sys.stdin是 TTY”,则您的程序已连接到 Windows“CON”(键盘)。如果sys.stdin不是 TTY,则它连接到文件或管道。


例子

Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\Documents and Settings\slott>python
Python 2.5.2 (r252:60911, Feb 21 2008, 13:11:45) [MSC v.1310 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> import sys
>>> os.isatty( sys.stdin.fileno() )
True
>>>
Run Code Online (Sandbox Code Playgroud)

的值True告诉我Python正在运行而没有附加文件或管道。 sys.stdin是键盘。使用 Windowskbhit是不必要的。

False告诉我 Python 正在运行并附加了文件或管道。 sys.stdin不是键盘。检查kbhit可能是有意义的。另外,我可以打开CON:设备并直接读取键盘,与sys.stdin.


我不知道为什么你需要“查看标准输入上是否有数据可供读取”。使用您想要完成的任务的其他详细信息更新您的问题可能会有所帮助。