当前位置: 首页 > 面试题库 >

您如何从没有结尾的管道中读取python中的stdin

柯立果
2023-03-14
问题内容

当管道来自“打开”(不知道正确的名称)文件时,我从标准输入或python中的管道读取问题。

我有例如 pipetest.py:

import sys
import time
k = 0
try:
   for line in sys.stdin:
      k = k + 1
      print line
except KeyboardInterrupt:
   sys.stdout.flush()
   pass
print k

我运行了一段时间后会继续输出和Ctrl + c的程序

$ ping 127.0.0.1 | python pipetest.py
^C0

我没有输出。但是,如果我通过普通文件,它就可以工作。

$ ping 127.0.0.1 > testfile.txt

片刻之后,按Ctrl + c结束

$ cat testfile.txt |  python pipetest.py

PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.017 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.015 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.014 ms
64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.013 ms
64 bytes from 127.0.0.1: icmp_seq=5 ttl=64 time=0.012 ms

--- 127.0.0.1 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 3998ms
rtt min/avg/max/mdev = 0.012/0.014/0.017/0.003 ms
10

在程序结束之前如何获得任何输出(在这种情况下ping已结束)?


问题答案:

尝试下一个:

import sys
import time
k = 0
try:
    buff = ''
    while True:
        buff += sys.stdin.read(1)
        if buff.endswith('\n'):
            print buff[:-1]
            buff = ''
            k = k + 1
except KeyboardInterrupt:
   sys.stdout.flush()
   pass
print k


 类似资料:
  • 我想运行node。js作为子流程,并向其提供输入。使用C,下面是我的一些示例代码。 我遇到的问题是,尽管子进程的stdout仍然指向终端,但在向子进程stdin输入打印的“helloworld”行后,我什么也看不到。即使我对管道进行了fflush()操作,我也看不到任何输出。但是,如果关闭管道的输入,则“Hello World”将显示在终端上。 子流程似乎只是缓冲-为什么?我希望最终将子流程std

  • 我在谷歌云数据流中运行批处理管道。我需要在一个管道中读取另一个管道以前写过的对象。最简单的wa对象是pickle/dill。 编写工作很好,编写了许多文件,每个文件都有一个pickled对象。当我手动下载文件时,我可以打开文件。编写代码: 要么... ...或者... (对象的类位于带有的路径中,但不确定为什么会错过最后一个字符) 谢谢!

  • 具有 您可以轻松地在python中读取YAML文件,但它没有得到在末尾我到达错误(与): 但YAML规范允许: YAML使用三个破折号(“--”)将指令与文档内容分开。如果没有指令,这也可以作为文档开始的信号。三个点(“…”)指示文档的结束,但不启动新文档,用于通信通道。 那么,你怎么看这个 在python中?

  • 问题内容: 我试图读取就是BEING柏油,流媒体,以标准输入存档,但我不知怎么读 远远 在管道的数据超过焦油发送。 我这样运行我的命令: 源代码是这样的: 对于100MB的涂油文件夹,我将获得1468个4MB的块(即6.15GB)!此外,数组的大小似乎无关紧要:如果将块大小设置为40MB,我仍然会获得约1400个40MB数据块,这根本没有意义。 要使用Go正确读取数据,我需要做些什么吗? 问题答案

  • 我想通过JobDSL生成基于管道插件的作业,该作业包含在Jenkins签出的git存储库中。 然而,我认为在作业DSL脚本中使用引用字符串的管道脚本不是很好。因此,我想将它们读入一个字符串,并将其传递给函数: 我必须把放在哪里才能工作?我试着把它放在我的DSL脚本旁边,也放在我的DSL源代码的文件夹中。但是Jenkins总是抛出一个“未找到文件”。

  • 我有一个不包含Jenkinsfile的存储库——我没有办法影响存储库本身。这意味着我既不能在存储库中添加也不能更改任何文件(在本例中,它是Qt-repo)。 我想做的是创建多个jenkinsfile,每个文件都为不同的目标配置和构建Qt库,或者运行不同的附加脚本<所有这些Jenkins文件将收集在不同的存储库中。 现在,我的问题是如何创建一个管道作业,一旦Qt存储库中发生更改,就会触发该作业,但使