【问题标题】:Reading stdout from a running script with Python使用 Python 从正在运行的脚本中读取标准输出
【发布时间】:2012-01-22 16:34:00
【问题描述】:

我在使用 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,,但我再次没有成功。我希望我能清楚地解释我的问题,因为我的英语不错。

感谢您的帮助。

【问题讨论】:

    标签: python stdout pipe stdin


    【解决方案1】:

    问题是缓冲之一。如果您在out.py 中明确刷新标准输出,它就会消失:

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

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

    【讨论】:

    • 感谢您的快速回复。就像一个魅力:) 我会看看 pty 的 arpwatch。
    • @MuhammetCan:不客气。忘记我对pexpect 所说的话,当您只读取进程的标准输出时,您将不需要它; pty 模块就足够了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-18
    相关资源
    最近更新 更多