如何在不阻塞的情况下读取python中的unix管道?

时间:2013-03-27 15:50:40

标签: python pipe

我想通过这样的管道读取进程的输出:

./backup.sh | my-python_program.py

我的python程序目前从stdin中读取:

buff =  sys.stdin.read()

虽然这看起来很幼稚但似乎阻止了需要很长时间才能执行的脚本。还有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

不确定python是如何包装它的,但你会想要使用select()的超时值很小。

答案 1 :(得分:0)

管道被明确设置为阻止,并且在大多数情况下它是有意义的 - 你的程序在没有读取输入时是否还有其他东西可以做?

如果是这样,那么你可以查看异步I / O,如果你要在python中这样做,我建议使用[gevent [(http://www.gevent.org/)让您使用轻量级线程来执行高效的异步I / O:

import gevent
from gevent import monkey; monkey.patch_all()

def read_from_stdin():
    buff = sys.stdin.read()
    # Whatever you're going to do with it

def some_other_stuff_to_do():
    # ...
    pass

gevent.Greenlet(read_from_stdin).run()
gevent.Greenlet(some_other_stuff_to_do).run()