Linux管道完成阅读,但想放弃休息

时间:2016-04-06 14:49:20

标签: python linux unix pipe subprocess

我有一段代码正在启动一个进程然后从stdout读取以查看它是否已加载好。

之后,我最好将输出重定向到/dev/null或丢弃它的东西。我是(A)在这种情况下最好的做法是什么?(B)如果管道变满,写作过程会发生什么?当管道变满并且没有被读取/清除时它会阻塞吗?

如果目标是重定向到/dev/null,是否可以通过python和subprocess.Popen向我展示如何使用?{/ p>

proc = subprocess.Popen(command, stderr=subprocess.PIPE)
while True:
    if init_string in proc.stderr.readline():
        break;

proc.stderr.redirect ?? 

2 个答案:

答案 0 :(得分:2)

据我所知,在开始执行后,无法关闭并重新打开子进程的文件描述符。是的,操作系统中存在有限的缓冲区,因此如果您不从管道中消耗任何内容,最终子进程将阻塞。这意味着你只需要继续读取管道,直到它从写入端关闭。

如果您希望程序在此期间继续执行有用的操作,请考虑将数据消耗部分移动到单独的线程(未经测试):

def read_all_from_pipe(pipe):
  for line in pipe: # assuming it's line-based
    pass

Thread(lambda: read_all_from_pipe(proc.stderr)).start()

但是,可能还有其他方法可以解决您的问题。为什么你需要首先等待一些特定的输出?如果没有“加载正常”,孩子不应该只用非零退出代码死掉吗?您是否可以检查孩子是否正在做它应该做的事情,而不是它打印一些任意输出?

答案 1 :(得分:-2)

如果您想丢弃所有输出:

python your_script.py > /dev/null

但是,如果您想从Python中执行此操作,可以使用:

import sys
sys.stdout = open('file', 'w')
print 'this goes to file'

每次打印时,标准输出都被重定向到文件“file”,将其更改为/ dev / null或您想要的任何文件,您将获得想要的结果。