找出Python中是否有来自管道的输入?

buh*_*htz 8 python pipe python-3.x

(我想)我知道如何从管道中读取.我的意思是像这样打电话给bash

echo Bähm | ./script.py
Run Code Online (Sandbox Code Playgroud)

这个Python3脚本适用于此.

#!/usr/bin/env python3
import sys

x = sys.stdin.read()

if x:
    print(x)
else:
    print('no pipe')

sys.exit()
Run Code Online (Sandbox Code Playgroud)

但是当我在bash上做这件事的时候

./script.py
Run Code Online (Sandbox Code Playgroud)

没有任何反应,因为它等待输入.

所以我想检查(在启动脚本时)是否有来自管道的输入.但我不知道为什么size或len没有工作sys.stdin或sys.stdin.buffer.

也许在处理Python的第2版和第3版之间存在差异?

kay*_*kay 8

如果您真的需要知道输入是否已通过管道输入,则可以使用@Cyrbil 的替代方法isatty:

from sys import stdin
from os import isatty

is_pipe = not isatty(stdin.fileno())
Run Code Online (Sandbox Code Playgroud)

  • @Cyrbil `$ echo '不' | python -c '从 sys 导入 stdin; print(stdin.isatty())'` 为我打印 `False` 。没有`echo``True`。 (2认同)

Cyr*_*bil 5

您可以将输入条目文件设置为非阻塞,并IOError: [Errno 11] Resource temporarily unavailable在没有管道传输时捕获。

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')
Run Code Online (Sandbox Code Playgroud)

  • 我不打算讨论 OP 说或不说的话。我想我根据所提供的信息量回答正确。你带来了一个没有引起的问题,然后在这之后加上 -1。这是一种奇怪的讨论方式。 (5认同)
  • 您基本上只是创建了一个不能解决问题的答案。然后编辑以包含 Kay 的解决方案,这将是我唯一要投票的解决方案。 (4认同)

Kar*_*ath 5

什么都不会发生,因为它等待输入

这是完全罚款。您想要修复不需要任何修复的问题,而作为副产品,您实际上正在制造问题。

想象一下,进行一些繁重计算的管道过程,因此需要一些时间来产生输出。您无法在python脚本中检查数据可用性。您不知道数据何时可用。你必须要有耐心。

因此,我想检查(启动脚本时)是否从管道输入。

别。如果由于某种原因,您的应用程序不希望与tty一起运行(等待用户输入),请进行检查。

sys.stdin.isatty()
Run Code Online (Sandbox Code Playgroud)

仅在存在一些困难时间限制时才检查数据可用性:例如:用户必须在2秒内做出响应。