Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
找出Python中是否有来自管道的输入?_Python_Python 3.x_Pipe - Fatal编程技术网

找出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()