我有一段代码正在启动一个进程然后从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 ??
答案 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或您想要的任何文件,您将获得想要的结果。