【问题标题】:Read Python stdin from pipe, without blocking on empty input从管道读取 Python 标准输入,而不会阻塞空输入
【发布时间】:2019-05-01 15:30:45
【问题描述】:

我正在尝试在 Python 脚本中读取标准输入,同时从管道接收。

我使用了这些行:

for line in sys.stdin:
    print line

并运行脚本:echo "test" | script.py

到目前为止,它工作正常。但是,如果我不使用管道,程序会停留在for 命令上。这意味着调用:./script.py 将使脚本不起作用。我该如何解决这个问题?

【问题讨论】:

  • 如果你调用./script.py,程序应该应该做什么?直接终止而不进入循环?
  • 不,它应该从函数返回并继续运行脚本的其余部分
  • 对不起,我的印象是for line in sys.stdin: print line 是你的整个程序。有功能吗?请分享您的整个代码。
  • 如果你运行python script.py 并输入几行应该回显的内容。然后按CTRL+D?
  • 一个更好的标题是 "Read Python stdin without blocking on empty input"

标签: python pipe stdin blocking nonblocking


【解决方案1】:

编辑:在这种情况下,您显然甚至不希望它读取行或处理KeyboardInterrupt,因此您需要做的是检查空的stdin。检查您是否是终端并如编辑示例所示通过。


sys.stdin 类似于文件。试试:

if not sys.stdin.isatty():
    data = sys.stdin.readlines()
    # Do something with data

如果你在没有stdin 的情况下运行它,我认为它不会像以前那样挂起......因为sys.stdin 将是空的。然后该函数应该继续。

【讨论】:

  • 感谢您的建议。但是,我已经尝试过和您一样的想法,但是没有用。
  • 你试了怎么回事,是不是又挂了?
  • 是的..它一直挂着。
  • @OhadVano:正如我的回答中所指出的,与其说是“挂起”,不如说是等待输入。
  • @OhadVano GreenMatt 是正确的,我编辑了我的示例来解决这个问题。
【解决方案2】:

您的脚本有效,只是您的期望似乎不正确。

script.py(针对 Python 3 进行了调整,这是我安装的):

import sys
for line in sys.stdin:
    print(line)

$ python script.py
abcd
abcd

xyz
xyz

第一次出现的“abcd”和“xyz”是我从键盘输入的,第二次出现的是程序的输出。我当时通过 ctrl-d 终止了执行。

问题在于,在没有管道输入的情况下从标准输入读取数据并不能满足您的期望。当您只运行脚本(没有管道输入)时,它就坐在那里等待您从键盘输入内容。您可能需要调查 raw_input 从键盘获取输入。

更新:

在 cmets 中获得更多关于您想要的内容的说明后,以下脚本可能会为您提供您想要的结果:

import sys
if not sys.stdin.isatty():
    for line in sys.stdin:
        print(line)

print("More stuff!")

【讨论】:

  • 我对从键盘输入不感兴趣。我想重新处理以下任何一种情况:有以前的管道输入或没有
  • @OhadVano:你原来的问题并不清楚。
  • 案例1:有管道重定向,意思是脚本调用形式为:echo "text" |脚本.py。案例2:脚本被无管道调用,意思是:script.py
  • @OhadVano:是的,你的问题很清楚。案例 2 所需的内容尚不清楚 - 至少对我来说不是。您似乎希望能够处理标准输入上没有数据的情况。正确的?如果是这样,你想让程序做什么?
【解决方案3】:

您可以通过在派生自sys.stdin 的文件描述符上调用isatty 来检查程序是否已通过管道传输。

像这样:

import os
import sys

if not os.isatty(sys.stdin.fileno()):
    print (sys.stdin.readlines())
else:
    print ("Skip, so it doesn't hang")

示例 1:

 echo "test" | python ./script.py
 ['test\n']

示例 2:

 python ./script.py 
 Skip, so it doesn't hang

【讨论】:

    猜你喜欢
    • 2018-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多