【问题标题】:Piping a Python script output continuosly to another program将 Python 脚本输出连续输送到另一个程序
【发布时间】:2015-12-03 21:52:19
【问题描述】:

我想将 Python 脚本中的一些数据连续输出到另一个程序。作为一个例子,我将使用cat,这是目前发生的情况:

如果我的test1.py 脚本是这样的:

print("Hello!")

当我运行./test1.py | cat 时,输出为Hello!,因为脚本在执行后立即终止。

当我有一个像test2.py 一样连续写入并且永不终止的脚本时,就会出现问题:

import time

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

然后./test2.py | cat 只是挂在那里,因为脚本没有终止。

我想每秒发送一个号码到cat并实时显示,可以吗?

【问题讨论】:

    标签: python unix pipe


    【解决方案1】:

    在您的打印中设置flush=True,您的输出正在缓冲,有一篇很好的文章Unix buffering delays output to stdout, ruins your day 解释了发生了什么:

    import time
    
    a = 0
    while True:
      a += 1
      print(a, flush=True)
      time.sleep(1)
    

    如果你使用 python2 添加from __future__ import print_function

    【讨论】:

    • 这解决了我的问题,我会将这个标记为正确答案,因为它不需要直接使用sys.stdout,也很高兴了解Python3的新功能。
    • @dan_s,别担心,我添加了一篇文章的链接,给出了很好的解释
    【解决方案2】:

    您需要在打印后刷新到标准输出。所以您的代码将如下所示:

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

    现在运行python script.py | cat 将打印一个。

    【讨论】:

      【解决方案3】:

      ./test2.py |尾 -f

      -f, --follow[={name|descriptor}]

            output  appended data as the file grows; -f, --follow, and --follow=descriptor are equivalent
      

      【讨论】:

        猜你喜欢
        • 2011-09-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-06
        • 1970-01-01
        • 1970-01-01
        • 2015-09-26
        • 1970-01-01
        相关资源
        最近更新 更多