是否可以同时在Python 3中从subprocess.run流化并捕获输出?

问题描述 投票:1回答:1

如果您这样做

subprocess.run(["echo hi && sleep 60"], shell=True, capture_output=False, timeout=5)

您将在终端上看到“ hi”字样,然后由于超时而引发异常。

但是,如果您这样做

ret = subprocess.run(["echo hi && sleep 6"], capture_output=True, timeout=2, shell=True)

您将看不到任何输出,并且据我所知,超时异常将阻止您获取生成的输出。 (shell=True对于此示例并不重要,我只需要一种方便的方法即可使其超时。)

这引起了以下问题:我(a)需要获取命令的输出,但是(b)有时会无意中运行挂起的命令,等待用户输入。我真的很希望能够捕获产生的任何输出,尽管抛出了Timeout Exception 将输出流传输到stdout / stderr并同时获得其副本。

python python-3.x subprocess
1个回答
1
投票
stderr

当相关命令在超时之前实际写入管道时将起作用。

但是如果子进程在完成之前被杀死,而子进程仍然在用户模式缓冲区中保留数据(它是块缓冲或行缓冲,并且从来没有写任何换行符之类的东西,那么它将永远不会被写入实际的管道,因此您将看不到它。

取消子进程的缓冲有很多不同的方式,因此我无法在实际情况下提供具体的信息(try: ret = subprocess.run("commands go here && sleep 6", capture_output=True, timeout=2, shell=True) except subprocess.TimeoutExpired as e: print(e.stdout) else: print(ret.stdout) 显然只是一个占位符),当echo通常用于子可执行文件不能被修改为具有行缓冲或非缓冲状态。

© www.soinside.com 2019 - 2024. All rights reserved.