python 如何检查stdin是否有一些数据?

gxwragnw  于 2023-05-21  发布在  Python
关注(0)|答案(7)|浏览(248)

在Python中,如何检查sys.stdin是否有数据?
我发现os.isatty(0)不仅可以检查stdin是否连接到TTY设备,还可以检查是否有数据可用。
但如果有人使用代码,如

sys.stdin = cStringIO.StringIO("ddd")

在使用os.isatty(0)之后,它仍然返回True。我需要做什么来检查stdin是否有数据?

rks48beu

rks48beu1#

在Unix系统上,您可以执行以下操作:

import sys
import select

if select.select([sys.stdin, ], [], [], 0.0)[0]:
    print("Have data!")
else:
    print("No data")

在Windows上,select模块可能只能与套接字一起使用,因此您需要使用替代机制。

zsbz8rwp

zsbz8rwp2#

我一直在用

if not sys.stdin.isatty()

下面是一个例子:

import sys

def main():
    if not sys.stdin.isatty():
        print "not sys.stdin.isatty"
    else:
        print "is  sys.stdin.isatty"

跑步

$ echo "asdf" | stdin.py
not sys.stdin.isatty

如果stdin未连接到交互式输入设备(例如,a tty)。

isatty(...)
    isatty() -> true or false. True if the file is connected to a tty device.
py49o6xq

py49o6xq3#

取决于此处的目标:

import fileinput
for line in fileinput.input():
    do_something(line)

也可以是有用的。

t98cgbkg

t98cgbkg4#

正如其他人所提到的,没有一种万无一失的方法可以知道数据是否可以从stdin中获得,因为UNIX不允许这样做(更普遍的是,因为它无法猜测stdin连接到的任何程序的未来行为)。
总是等待stdin,即使可能什么都没有(这就是grep等。do),或者要求用户输入-参数。

oipij1gg

oipij1gg5#

我发现了一种使用compared.futures库中的future的方法。这是一个gui程序,当你还在等待STDIN时,它允许你滚动并点击等待按钮。每当程序看到它有一行来自STDIN的信息时,它就会将其打印在多行框中。但是它并不锁定脚本,将用户从gui界面中锁定,为什么它要检查stdin中的新行。(请注意,我在python 3.10.5中测试了这一点)

import concurrent.futures
import PySimpleGUI as sg
import sys

def readSTDIN():
    return sys.stdin.readline()

window = sg.Window("Test Window", [[sg.Multiline('', key="MULTI", size=(40, 10))],
                                   [sg.B("QUIT", bind_return_key=True, focus=True),
                                    sg.B("Wait")]], finalize=True, keep_on_top=True)
for arg in sys.argv[1:]:
    window["MULTI"].print(f"ARG={arg}")
with concurrent.futures.ThreadPoolExecutor() as pool:
    futureResult = pool.submit(readSTDIN)
    while True:
        event, values = window.read(timeout=500)
        if event != "__TIMEOUT__":
            window['MULTI'].print(f"Received event:{event}")
        if event in ('QUIT', sg.WIN_CLOSED):
            print("Quit was pressed")
            window.close()
            break
        if futureResult.done(): # flag that the "future" task has a value ready;
                                #therefore process the line from STDIN
            x = futureResult.result()
            window["MULTI"].print(f"STDIN:{x}")
            futureResult = pool.submit(readSTDIN) #add a future for next line of STDIN
lymnna71

lymnna716#

上面看到了很多答案,其中几乎所有的答案都需要sys,select,os等。然而,我得到了一个非常简单的想法,如果stdin有数据,如何连续地从stdin获取输入。我们可以使用try,except block来实现。因为,

while(1):
  try:
    inp = input()
  except:
     break

上面的循环将运行,我们不断地检查输入并将输入存储在变量“inp”中,如果在stdin中没有输入,那么try将抛出一个错误,但是除了块break语句存在,所以while循环将终止

klsxnrf1

klsxnrf17#

使用内置模块,可以通过以下代码Gregg gave already the idea实现:

import fileinput
isStdin = True
for line in fileinput.input:
    # check if it is not stdin
    if not fileinput.isstdin():
        isStdin = False
        break
    # continue to read stdin
    print(line)
fileinput.close()

相关问题