使用Python从正在运行的脚本中读取stdout

时间:2012-01-22 16:34:00

标签: python stdout pipe stdin

我在使用python时遇到了一些麻烦。我试图从正在运行的脚本获取输出并在另一个脚本中使用它。所以,我想要做的就是这样;

假设out.pyin.py喜欢这些;

# out.py
def main():
    while True:
        print "test"
        time.sleep(10)
main()

# in.py
text = sys.stdin.readline()
print "hello " + text

我想运行这样的脚本,

$ python out.py | python in.py

但是,这会挂起并打印,而不是每10秒打印一次“hello test”。从此,我猜测|等待out.py终止。那么,如果我想将in.py与守护进程一起使用,该怎么办?

我的实际问题是;我正试图从arpwatch获得输出。 arpwatch作为守护进程运行,并将ip / mac配对发送到stderr。我想得到那个输出并解析它;所以,我需要这样的东西;

$ arpwatch | python myscript.py

要实现这一点,我应该如何编码myscript.py?我曾试图使用subprocess module,,但我没有再次成功。我希望我能清楚地解释我的问题,因为我的英语很不错。

感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

问题在于缓冲。如果你在out.py中明确刷新stdout,它就会消失:

import sys
import time

def main():
    while True:
        print "test"
        sys.stdout.flush()
        time.sleep(10)
main()

不幸的是,你必须依靠arpwatch这样做;如果没有,你会想要尝试PTYs而不是管道,因为那些算作终端并且会导致大多数应用程序使用行缓冲而不是块缓冲。