Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在不阻塞的情况下读取python中的unix管道?_Python_Pipe - Fatal编程技术网

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

如何在不阻塞的情况下读取python中的unix管道?,python,pipe,Python,Pipe,我想通过如下管道读取流程的输出: ./backup.sh | my-python_program.py 我的python程序当前从stdin读取: buff = sys.stdin.read() 尽管这看起来很幼稚,而且似乎阻碍了一个需要很长时间才能执行的脚本。有更好的方法吗?不确定python如何包装它,但您希望使用一个小的超时值。不确定python如何包装它,但您希望使用一个小的超时值。管道被显式设置为阻塞,在大多数情况下,它是有意义的——您的程序在运行时是否有其他可以执行的操作不读取

我想通过如下管道读取流程的输出:

./backup.sh | my-python_program.py
我的python程序当前从stdin读取:

buff =  sys.stdin.read()

尽管这看起来很幼稚,而且似乎阻碍了一个需要很长时间才能执行的脚本。有更好的方法吗?

不确定python如何包装它,但您希望使用一个小的超时值。

不确定python如何包装它,但您希望使用一个小的超时值。

管道被显式设置为阻塞,在大多数情况下,它是有意义的——您的程序在运行时是否有其他可以执行的操作不读取输入

如果是这样,那么您可以研究异步I/O,如果您打算在python中实现这一点,我建议使用[
gevent
[()”,这将允许您使用轻量级线程来实现高效的异步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()

管道被显式地设置为阻塞,对于大多数目的来说,这是有意义的——当不读取输入时,您的程序是否有其他可以执行的操作

如果是这样,那么您可以研究异步I/O,如果您打算在python中实现这一点,我建议使用[
gevent
[()”,这将允许您使用轻量级线程来实现高效的异步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()

这不是在阻止你期望做的事情吗?这不是在阻止你期望做的事情吗?当然,你可以使用
select(2)
,但是它的级别非常低,
gevent
提取了很多重复的细节。它还可以使用更高效的算法(
epoll(2)
kqueue(2)
)。当然,您可以使用
select(2)
,但它的级别非常低,
gevent
提取了大量重复的细节。它还可以使用更高效的算法(
epoll(2)
kqueue(2)
)。