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版之间存在差异?
如果您真的需要知道输入是否已通过管道输入,则可以使用@Cyrbil 的替代方法isatty:
from sys import stdin
from os import isatty
is_pipe = not isatty(stdin.fileno())
Run Code Online (Sandbox Code Playgroud)
您可以将输入条目文件设置为非阻塞,并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)
什么都不会发生,因为它等待输入
这是完全罚款。您想要修复不需要任何修复的问题,而作为副产品,您实际上正在制造问题。
想象一下,进行一些繁重计算的管道过程,因此需要一些时间来产生输出。您无法在python脚本中检查数据可用性。您不知道数据何时可用。你必须要有耐心。
因此,我想检查(启动脚本时)是否从管道输入。
别。如果由于某种原因,您的应用程序不希望与tty一起运行(等待用户输入),请进行检查。
sys.stdin.isatty()
Run Code Online (Sandbox Code Playgroud)
仅在存在一些困难时间限制时才检查数据可用性:例如:用户必须在2秒内做出响应。