繁体   English   中英

Linux管道已完成读取,但要放弃其余部分

[英]Linux pipe finished reading but want to discard rest

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

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

如果目标是重定向到/dev/null ,那么有可能向我展示如何使用python和subprocess.Popen做到这一点?

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

proc.stderr.redirect ?? 

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

如果您希望程序在此期间继续做一些有用的事情,请考虑将数据消耗部分移至单独的线程(未经测试):

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()

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

如果要放弃所有输出:

python your_script.py > /dev/null

但是,如果要从Python进行操作,可以使用:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM