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
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()
7条答案
按热度按时间rks48beu1#
在Unix系统上,您可以执行以下操作:
在Windows上,select模块可能只能与套接字一起使用,因此您需要使用替代机制。
zsbz8rwp2#
我一直在用
下面是一个例子:
跑步
如果
stdin
未连接到交互式输入设备(例如,a tty)。py49o6xq3#
取决于此处的目标:
也可以是有用的。
t98cgbkg4#
正如其他人所提到的,没有一种万无一失的方法可以知道数据是否可以从stdin中获得,因为UNIX不允许这样做(更普遍的是,因为它无法猜测stdin连接到的任何程序的未来行为)。
总是等待stdin,即使可能什么都没有(这就是
grep
等。do),或者要求用户输入-
参数。oipij1gg5#
我发现了一种使用compared.futures库中的future的方法。这是一个gui程序,当你还在等待STDIN时,它允许你滚动并点击等待按钮。每当程序看到它有一行来自STDIN的信息时,它就会将其打印在多行框中。但是它并不锁定脚本,将用户从gui界面中锁定,为什么它要检查stdin中的新行。(请注意,我在python 3.10.5中测试了这一点)
lymnna716#
上面看到了很多答案,其中几乎所有的答案都需要sys,select,os等。然而,我得到了一个非常简单的想法,如果stdin有数据,如何连续地从stdin获取输入。我们可以使用try,except block来实现。因为,
上面的循环将运行,我们不断地检查输入并将输入存储在变量“inp”中,如果在stdin中没有输入,那么try将抛出一个错误,但是除了块break语句存在,所以while循环将终止
klsxnrf17#
使用内置模块,可以通过以下代码Gregg gave already the idea实现: