找出Python中是否有来自管道的输入?
(我想)我知道如何从管子里读东西。我是说像这样的聚会找出Python中是否有来自管道的输入?,python,python-3.x,pipe,Python,Python 3.x,Pipe,(我想)我知道如何从管子里读东西。我是说像这样的聚会 echo Bähm | ./script.py 这个Python3脚本可以处理这个问题 #!/usr/bin/env python3 import sys x = sys.stdin.read() if x: print(x) else: print('no pipe') sys.exit() 但当我只是在狂欢节上这么做的时候 ./script.py 因为它等待输入,所以什么也没有发生 因此,我想检查(启动脚本时)
echo Bähm | ./script.py
这个Python3脚本可以处理这个问题
#!/usr/bin/env python3
import sys
x = sys.stdin.read()
if x:
print(x)
else:
print('no pipe')
sys.exit()
但当我只是在狂欢节上这么做的时候
./script.py
因为它等待输入,所以什么也没有发生
因此,我想检查(启动脚本时)是否有来自管道的输入。但是我不知道为什么size
或len
不能在sys.stdin
或sys.stdin.buffer
上工作
Python的第2版和第3版在处理这一点上也可能有所不同?您可以将输入条目文件设置为非阻塞,并在没有管道传输时捕获暂时不可用的
IOError:[Errno 11]资源
import fcntl
import os
import sys
# make stdin a non-blocking file
fd = sys.stdin.fileno()
fl = fcntl.fcntl(fd, fcntl.F_GETFL)
fcntl.fcntl(fd, fcntl.F_SETFL, fl | os.O_NONBLOCK)
try:
print(sys.stdin.read())
except:
print('No input')
您可以使用select,但它在Windows上不起作用:
import sys
import select
# Input: zero or more file-like objects
# Returns: list of objects that can be read
def can_read_files(*args):
return select.select(args, [], [], 0.0)[0]
if can_read_files(sys.stdin):
print(sys.stdin.read())
else:
print('No input')
对我们来说:
if select.select([sys.stdin], [], [], 0.0)[0]:
...
如果您真的需要知道输入是否通过管道输入,可以使用@Cyrbil的答案,也可以使用:
因为它等待输入,所以什么也没有发生
那很好。你想要修复一些不需要任何修复的东西,作为副产品,你实际上在制造问题
想象一下,一个管道过程需要进行一些繁重的计算,因此需要一些时间来产生输出。无法检查python脚本中的数据可用性。您不知道数据何时可用。你必须有耐心
因此,我想检查(启动脚本时)是否有来自
管不管
不要。如果出于某种原因,您的应用程序不打算使用tty(等待用户输入)运行,请检查该选项
sys.stdin.isatty()
仅当存在一些硬时间限制时才检查数据可用性:例如:用户必须在2秒内作出响应。此Python-3.x是否特定?我将在标签编辑中输入批准或不批准。我对Python2一无所知。我的例子是Python3。它们之间往往存在相关的差异。这就是为什么我尽量使我的问题尽可能具体。还有很多关于Python的问题,将2和3混为一谈,让读者感到困惑。听起来真是个坏主意。如果管道过程只是需要一些时间才能产生一些输出呢?@KarolyHorvath:这不是buhtz要求的。他想知道是否有任何意见。Cyrbil的代码可能是最跨平台的方法。如果你想等待,就用计时器将他的代码放入一个循环中,直到时间到期或read()返回。@KarolyHorvath:我同意你的观点,但我们只能做这么多。我不想讨论OP说了什么或没有说什么。根据提供的信息量,我想我的回答是正确的。你带来了一个没有被唤起的问题,然后把a-1放在后面。这是一种奇怪的讨论方式。你基本上只是创造了一个无法解决问题的答案。然后编辑以包含Kay的解决方案,这将是我唯一要投票的解决方案。我没有带来此解决方案,因为我在stdin.isatty()
中有一些意外行为,但在os.isatty()
中,这似乎很好。@Cyrbil,我不知道你可以直接“询问”stdin是否是TTY。谢谢你的信息!我说不出有什么不同。也许PTY?的一些奇怪之处看起来像stdin.isatty()
总是返回True
。我不能提出一个它返回我为假的案例。。。所以os.isatty()
是最好的方法。@Cyrbil$echo'No'| python-c'来自sys import stdin;打印(stdin.isatty())“
为我打印False
。没有回声
真
。这对我的案例有效。但我不确定我是否理解它背后的概念是正确的。也许在某些情况下它并没有像我预期的那样起作用?据我所知不是。。。即使检查tty似乎也有点过头了,试试任何好公民unix工具,cat
,sed
。。。他们都会耐心等待用户的输入。检查OTOH的输入可用性将打破unix管道黑盒抽象,因为期望立即输入是不现实的?您可以说less file.txt
或cat file.txt | less
。这和我想的不一样吗?当你分页输出时,在终端上打字真的没有意义。如果有充分的理由阻止在tty上运行,请继续检查。
sys.stdin.isatty()