【问题标题】:Read from pipe without an end [duplicate]从没有结束的管道中读取[重复]
【发布时间】:2018-10-28 06:25:06
【问题描述】:

如果我有一个带有不停止的连续数据流的管道,我在从stdin 读取 python 时遇到问题。

例如,我有 data_stream.py

import time

i = 0
while True:
    print(i)
    i += 1
    time.sleep(2)

现在我尝试使用文件 read_data.py

读取数据
import sys
for line in sys.stdin:
    print(line)

当我尝试使用python3 data_stream.py | python3 read_data.py 运行它时,我没有得到任何结果,因为data_stream.py 没有完成。 我如何在data_stream.py 仍在运行时读取它?

【问题讨论】:

  • 此代码无法运行,因为 (a) 您尚未导入 sys,并且 (b) 您在 for 的末尾没有冒号。如果没有演示您的问题的代码,我们将无法调试您的代码。此外,了解您使用的平台确实很有帮助。请阅读帮助中的minimal reproducible example,以获取有关问题内容的指导。
  • 管道总是在写入程序仍在运行时馈入读取程序,但这并不意味着读取器始终可以立即看到写入,而没有一定的长度限制被满足或显式刷新。 (在 大多数 语言中,当 stdout 是 TTY 时,默认情况下对 stdout 的写入是行缓冲的,但当它是 FIFO 时,默认情况下是块大小块缓冲)。有关当前问题的非 Python 特定讨论,请参阅 BashFAQ #9

标签: python shell command pipe stdin


【解决方案1】:

您必须“刷新” data_stream.py 中的标准输出和 read_data.py 中的“readline”。 完整代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#  data_stream.py

import sys
import time

i = 0
while True:
    print(i)
    i += 1
    sys.stdout.flush()
    time.sleep(2)

还有 read_data.py 的代码

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#  read_data.py

import sys

# Now I try to read the data with the file read_data.py

while True:
    line = sys.stdin.readline()
    print (line),

最好的问候,

【讨论】:

  • How to Answer 中,请参阅“回答正确提出的问题”部分,以及其中有关“...之前已经被多次询问和回答”的问题的要点。跨度>
  • 非常感谢查尔斯,我是新来的。最后我犯了一些错误。
猜你喜欢
  • 2019-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-02
  • 1970-01-01
  • 1970-01-01
  • 2011-10-28
  • 2018-12-31
相关资源
最近更新 更多