如何获取Python子进程的输出并在之后终止它?

时间:2019-06-30 15:07:28

标签: python python-3.x subprocess

我想获取我的子流程的输出。由于它无限期运行,我想在满足某些条件时终止它。

当我使用check_output启动子流程时,我得到了输出但没有终止流程的句柄:

output = subprocess.check_output(cmd, shell=True)

当我使用Popenrun启动子流程时,我得到了一个终止该流程的句柄,但没有输出。

p = subprocess.Popen(cmd, shell=True, preexec_fn=os.setsid)

我怎么都能得到?

3 个答案:

答案 0 :(得分:1)

什么时候可以知道您已获得完整的过程输出?当进程终止时。因此,无需手动终止它。只需等待它结束,便可以使用check_output

现在,如果您要等待给定模式出现,请然后终止,这就是其他内容。只需逐行读取,如果某些模式匹配,则中断循环并结束该过程

p = subprocess.Popen(cmd, shell=True, preexec_fn=os.setsid) # add stderr=subprocess.PIPE) to merge output & error
for line in p.stdout:
   if b"some string" in line:  # output is binary
       break
p.kill() # or p.terminate()

答案 1 :(得分:0)

您需要告诉Popen您想阅读标准输出,但这可能有点棘手。

p = subprocess.Popen(cmd, shell=True, preexec_fn=os.setsid, stdout=subprocess.PIPE)
while True:
    chunk = p.stdout.read(1024)  # this will hang forever if there's nothing to read
p.terminate()

答案 2 :(得分:0)

尝试:

import subprocess
p = subprocess.Popen("ls -a", shell=True, stdout=subprocess.PIPE,stderr=subprocess.PIPE)
print((p.stdout.read()))
if p.stdout.read() or p.stderr.read():
    p.terminate()